C: использование функции для получения входных данных в другом формате

#c

#c

Вопрос:

Я крайний новичок в C, я написал следующий код:

 # include <stdio.h>

static char * getInfo(char info[15]){
    static char res[15];
    printf("Please enter your %s:n", info);
    scanf("%s", res);
    return res;
}

static int getNum(char info[15]){
    static int res;
    printf("Please enter your %s:n", info);
    scanf("%d", amp;res);
    return res;
}

int main(){
    static char * name;
    static char * title;
    name = getInfo("name");
    title = getInfo("title");
    
    int age;
    age = getNum("age");
    
    printf("Welcome %s %s age %dn", name, title, age);
    return 0;
}

/*
Please enter your name:
Ben
Please enter your title:
Hansan
Please enter your age:
32
Welcome Hansan Hansan age 32
Program ended with exit code: 0
*/
  

Я пытаюсь получить входные данные в строковом и целочисленном формате с помощью функций.

Я не понимаю, почему Hansan это дублируется, я буду очень рад, если кто-нибудь предложит какие-то предложения.

Комментарии:

1. Похоже, вы только что обнаружили static ключевое слово и используете его для всего. Проблема, конечно, в том, что getInfo имеет один статический массив, и он всегда возвращает указатель на этот массив. Этот указатель никогда не меняется, потому что так работает статическая продолжительность хранения. Если вы хотите сохранить результаты нескольких вызовов этой функции, вам нужно скопировать строку, а не просто сохранить указатель.

2. относительно: scanf("%s", res); 1) существует МНОЖЕСТВО способов, которыми пользователь может вызвать сбой этого оператора. Проще всего было бы ввести более 14 символов. Предлагаю: if( scanf("s", res) != 1 ) { //handle error } обратите внимание на модификатор MAX CHARACTERS 14 , который на 1 меньше длины входного буфера, потому %s что к входным данным всегда добавляется нулевой байт. Обратите внимание, что возвращаемое значение ДОЛЖНО быть 1 (количество успешных спецификаторов преобразования формата ввода). Аналогичная проверка возвращаемого значения необходима для scanf("%d", amp;res);

Ответ №1:

Это связано с тем, что вы используете static переменную для хранения входных данных, статическая переменная всегда содержит последние данные, хранящиеся в ней.

 static char * getInfo(char info[15]){
    static char res[15];
    printf("Please enter your %s:n", info);
    scanf("%s", res);
    return res;
}
  

измените его на

 char * getInfo(char info[15]){
    char *res = malloc(15);
    printf("Please enter your %s:n", info);
    scanf("%s", res);
    return res;
}
  

и free память после завершения обработки в main.

   int main(){
    char * name;
    char * title;
    name = getInfo("name");
    title = getInfo("title");
    
    int age;
    age = getNum("age");
    
    printf("Welcome %s %s age %dn", name, title, age);

    free(name);
    free(title);
    return 0;
}
  

Комментарии:

1. Я не вызывал free весь свой предыдущий код!!! они все еще будут существовать?

2. @duck Вы не можете free использовать статическую переменную, в последнем коде, который мы добавили free , потому что я выделяю время выполнения памяти с помощью malloc .

3. Нужно ли мне использовать free , если я определяю const char метод?