char myStr[varLength] работает в C?
У меня есть следующее (код здесь):
int isVMin(char c){
return c == 'a' ||
c == 'e' ||
c == 'i' ||
c == 'o' ||
c == 'u' ||
c == 'y';
}
int isNum(char c){
return c>='0' && c<='9';
}
int removeChars(char str[]){ // removes all vowels, returns the digits number
int slen = strlen(str);
//char* res = malloc(sizeof(char)*slen+1);
char res[slen + 1]; /// <<<<<<<<<<<<<<<<<<<<<<<<<<<<< DOES IT WORK AS EXPECTED???
printf("\nthe initial is: '%s'\n", res);
int numCount = 0, j = 0;
for (int i = 0; i < slen; i++) {
if (isVMin(str[i]));
//str[i]= ' ';
else {
res[j++] = str[i];
if (isNum(str[i]))
numCount++;
}
}
res[j] = '\0';
printf("\nthe removed is: '%s'\n", res);
//str = res;
return numCount;
}
int main(){
char phrase[50];
gets(phrase);
int nb = removeChars(phrase);
printf("\nLa phrase '%s' contient %d digits", phrase, nb);
return 0;
}
Программа компилируется и работает как положено. Однако у меня есть сомнения, является ли это использование законным в C...
нет, вопрос в том, могу ли я использовать переменную в качестве размера массива
Это именно то, что представляет собой массив переменной длины. Ключ как бы в названии.
ОТ: Ваша функция isNum дублирует стандартную функцию isdigit.
Совет: isdigit() существует.
И никогда не используйте gets! Это настолько опасно, что его даже убрали из спецификации языка Си. Используйте, например. fgets вместо этого.
Пожалуйста, не используйте "gets", прочитайте это:stackoverflow.com/questions/1694036/…
@Someprogrammerdude: На самом деле это не так. Одно отличие состоит в том, что они работают независимо от знака char, тогда как поведение isdigit не определено, когда ему передается отрицательное значение, отличное от EOF.
@Someprogrammerdude, в C все опасно. и gets - это единственный известный мне метод чтения строки из консоли без написания миль строк кода...
fgets помещает новую строку char в конец... с ума сходит этот язык... такая штука, прочитать строку текста, так сложно...





char res[slen + 1]; /// <<<<<<<<<<<<<<<<<<<<<<<<<<<<< DOES IT WORK AS EXPECTED???
Это работает, начиная с C '99.
Вы немного ограничены в размерах. Эмпирическое правило: превышение 8k, вероятно, не рекомендуется. Обратите внимание, что в Windows, если весь стек превысит 1 МБ, программа вылетит. В современном Unix. то же самое происходит и на большем пределе.
При этом вы не можете вернуть его. Просто говорю'
Здесь strdup(), чтобы получить буфер приблизительного размера, может быть хорошим местом для начала, а затем realloc(), чтобы обрезать его, если это важно.
вы не можете вернуть его ... ? что ты имеешь в виду?
@Serge: Это значит не пиши char res[slen + 1]; return res;. Если вам нужно сделать что-то подобное, вам нужно malloc() в конце концов.
почему не вернуть? этот язык сумасшедший
@Serge: Этот язык не сумасшедший. Этот язык ничего не делает за вашей спиной и поэтому не может неявно выделять массив в куче. Очевидное отсутствие гарантий становится действительно необходимой защитой при работе в режиме ядра.
Итак, внутри функции она выделяет память (где в стеке?), а снаружи - нет (в куче?)
@Serge: Правильно насчет внутри. Массив попадает в стек. Если вы хотите жить после возврата функции, вы должны сами выделить ее в куче.
Это сработало, как ожидалось, когда вы пытались? Если вы спрашиваете: «Есть ли в C массивы переменной длины?» ответ "Да".