Переменный размер символа без malloc в C

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...

Это сработало, как ожидалось, когда вы пытались? Если вы спрашиваете: «Есть ли в C массивы переменной длины?» ответ "Да".

tadman 09.12.2020 21:55

нет, вопрос в том, могу ли я использовать переменную в качестве размера массива

serge 09.12.2020 21:56

Это именно то, что представляет собой массив переменной длины. Ключ как бы в названии.

tadman 09.12.2020 21:57

ОТ: Ваша функция isNum дублирует стандартную функцию isdigit.

Some programmer dude 09.12.2020 21:58

Совет: isdigit() существует.

tadman 09.12.2020 21:58

И никогда не используйте gets! Это настолько опасно, что его даже убрали из спецификации языка Си. Используйте, например. fgets вместо этого.

Some programmer dude 09.12.2020 22:00

Пожалуйста, не используйте "gets", прочитайте это:stackoverflow.com/questions/1694036/…

MED LDN 09.12.2020 22:00

@Someprogrammerdude: На самом деле это не так. Одно отличие состоит в том, что они работают независимо от знака char, тогда как поведение isdigit не определено, когда ему передается отрицательное значение, отличное от EOF.

Eric Postpischil 09.12.2020 22:41

@Someprogrammerdude, в C все опасно. и gets - это единственный известный мне метод чтения строки из консоли без написания миль строк кода...

serge 09.12.2020 23:59

fgets помещает новую строку char в конец... с ума сходит этот язык... такая штука, прочитать строку текста, так сложно...

serge 10.12.2020 00:11
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
10
93
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
char res[slen + 1]; /// <<<<<<<<<<<<<<<<<<<<<<<<<<<<< DOES IT WORK AS EXPECTED???

Это работает, начиная с C '99.

Вы немного ограничены в размерах. Эмпирическое правило: превышение 8k, вероятно, не рекомендуется. Обратите внимание, что в Windows, если весь стек превысит 1 МБ, программа вылетит. В современном Unix. то же самое происходит и на большем пределе.

При этом вы не можете вернуть его. Просто говорю'

Здесь strdup(), чтобы получить буфер приблизительного размера, может быть хорошим местом для начала, а затем realloc(), чтобы обрезать его, если это важно.

tadman 09.12.2020 21:59

вы не можете вернуть его ... ? что ты имеешь в виду?

serge 10.12.2020 00:12

@Serge: Это значит не пиши char res[slen + 1]; return res;. Если вам нужно сделать что-то подобное, вам нужно malloc() в конце концов.

Joshua 10.12.2020 00:34

почему не вернуть? этот язык сумасшедший

serge 10.12.2020 00:50

@Serge: Этот язык не сумасшедший. Этот язык ничего не делает за вашей спиной и поэтому не может неявно выделять массив в куче. Очевидное отсутствие гарантий становится действительно необходимой защитой при работе в режиме ядра.

Joshua 10.12.2020 00:52

Итак, внутри функции она выделяет память (где в стеке?), а снаружи - нет (в куче?)

serge 10.12.2020 01:26

@Serge: Правильно насчет внутри. Массив попадает в стек. Если вы хотите жить после возврата функции, вы должны сами выделить ее в куче.

Joshua 10.12.2020 01:27

Другие вопросы по теме