2015-02-18 2 views
2

Когда я ввожу данные, как фамилию, у меня есть это, поэтому он ограничивает это до 10 символов, но когда я пытаюсь ввести фамилию, символы, которые были исключены из первого имени, помещаются в фамилию. Например, если я нахожу aaaaaaaaaab, он будет хранить a, но b будет помещен в фамилию.fgets limit limit length

Любые предложения, как я это исправить? Я хочу, чтобы он ограничивал длину до нужной суммы.

printf("you chose add new record\n"); 
printf("enter the person information: \n"); 
printf("Please enter the first name: \n"); 
//limits to size 10 
char namein[11]; 
fgets(namein, 11, stdin); 
printf("the first name was: %s\n", namein); 

printf("Please enter the last name: \n"); 
//limits to size 20 
char lastin[21]; 
fgets(lastin, 21, stdin); 
printf("the last name was: %s\n", lastin); 
+1

Вы хотите настоять на том, чтобы имя и фамилия были введены на две строки ввода, или вы будете принимать «имя первого имени» в одной строке как действительную? Методы использования различны. Первое проще; вы можете прочитать всю строку вперед (с большим буфером _much_) и использовать 'sscanf()' для постпроцесса буфера. Обратите внимание: если кто-то войдет в Jim E Cork', ваш 'fgets()' получит 'Jim E Cork' в' namein'; неясно, что это именно то, что вы хотели. Кроме того, следующий 'fgets()' получит только новую строку после «Jim E Cork», которая также не то, что вы хотели. –

+0

Я в основном собираюсь искать первые 10 символов, поэтому, если бы имя было jimmyeguysZ, Z был бы отключен и сохранил бы вход только как jimmyeguys –

ответ

3

Проверьте результат использования fgets().

Если буфер содержит \n, не нужно искать больше. В противном случае используйте потенциальные дополнительные данные до '\n' или EOF.

int ConsumeExtra(const char *buf) { 
    int found = 0; 
    if (strchr(buf, '\n') == NULL) { 
    int ch; 
    // dispose of extra data 
    while ((ch = fgetc(stdin)) != '\n' && ch != EOF) { 
     found = 1; 
    } 
    } 
    return found; 
} 

char namein[11]; 
if (fgets(namein, sizeof namein, stdin) == NULL) Handle_EOForIOError(); 
if (ConsumeExtra(namein)) Handle_ExtraFound(); 

Примечание: рекомендуется не быть настолько маленьким с входными буферами. Лучше читать в общий большой буфер, а затем квалифицировать ввод до сохранения до namein. IOW, предпочитают сохранять раздельный ввод и сканирование/разбор.

char buffer[100] 
char namein[11]; 
if (fgets(namein, sizeof buf, stdin) == NULL) Handle_EOForIOError(); 
if (ConsumeExtra(buf)) Handle_InsaneLongInput(); 

int n = 0; 
sscanf(buffer, "%10s %n", namein, &n); 
if (n == 0 || buf[n]) Handle_NothingOrExtraFound(); 
+0

ладно спасибо, но что именно заставляет лишние буквы удаляться от первого ввода и добавляется ко второму? –

+0

@Austin Smith 'ConsumeExtra()' потребляет дополнительный 'char' и бросает их в [бит ведро] (http://en.wikipedia.org/wiki/Bit_bucket). Поэтому, когда происходит следующее 'fgets()', он получает свежий ввод пользователя. – chux

-1

Перед выполнением следующего чтения вы должны прочитать весь буфер ввода. Такая операция называется «дренированием» входа.

Так что ваш код должен выглядеть

get the first name 
read the first name 
drain the input 
print the prompt for the last name 
read the last name 

осушение вход выглядит примерно

while (there is data that can be read) { 
    read a character 
} 
+2

Я думаю, что ваш «дренаж» немного в восторге; он должен быть обычно «while (следующий символ не является EOF или новой строкой)», если вы настаиваете на том, чтобы данные вводились по одному слову на строку. –

+0

@JonathanLeffler Возможно, но действительно ли что-либо перед представлением следующего запроса сохраняемым? Я имею в виду, если они пять раз вернутся к каретке, действительно ли вы хотите, чтобы следующий вытащенный вход был пустым? –

+1

Я думаю, это зависит от того, что вы подразумеваете под 'while (есть данные, которые можно прочитать)'. Существует не стандартная функция, чтобы посмотреть, есть ли еще какие-либо символы уже во входном буфере. Чтение до новой строки (или EOF, если последняя строка не имеет новой строки) является разумной интерпретацией, но вы можете иметь более сложную схему. –