#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 CHARACTERS14
, который на 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
метод?