Итак, в течение долгого времени я использовал scanf(), но меня всегда беспокоило, когда ввод длиннее строки, поэтому он портит код (меняет другие целые числа и тому подобное).
Поэтому мне сказали, что вместо этого я должен использовать fgets(), потому что он может ограничить количество читаемых букв и символов.
Но fgets() всегда также включает символ новой строки (\n), поэтому мне посоветовали использовать команду input[strcspn(input, "\r\n")] = '\0';
, которая должна удалить \n из строки.
И, конечно, была еще одна проблема. Когда ввод был длиннее строки, происходило одно из двух:
1. он оставляет ввод на экране и перемещает мой курсор только на одну строку ниже, что эффективно блокирует мою программу. (неправда, исправлено, правильно зациклив программу)
- он пропускает следующий fgets() (один или несколько).
Я где-то читал, что это может быть потому, что fgets() считывает остальную часть ввода при следующем вызове, но я пытался очищать строку каждый раз, прежде чем писать в нее снова, но это немного не помогло.
Кто-нибудь знает, как решить эту проблему? Это беспокоило меня в течение некоторого времени, так как я никогда не добивался идеального ввода в строковую программу (с отказоустойчивыми, поскольку люди делают ошибки)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char input[3];
int main(){
begin:
fgets(input, 3, stdin);
input[strcspn(input, "\r\n")] = '\0';
if(strcmp(input, "1")==0){
printf("input = 1\n");
}
else if(strcmp(input, "2")==0){
printf("input = 2\n");
}
goto begin;
}
К сожалению, я не смог воссоздать 1-ю проблему, но вторая работает, набрав xx1 или xx2.
Заранее спасибо!
strlen(s)-1
в качестве индекса дляs
. Если строка пуста, результаты будут не такими, как вы хотите.fgets
нужно проверить 22.06.2018malloc
иrealloc
22.06.2018eof(stdin)
истинно. В противном случае отсутствие новой строки в самой последней строке файла вызовет проблемы. 22.06.2018fgets()
не может вернуть пустую строку в случае успеха. 22.06.2018malloc()/realloc()
необходим, если только вы не пытаетесь дублировать функциональностьgetline()
, которая может возвращать строку любого размера. 22.06.2018if
потерпит неудачу, поэтому он не заменяет новую строку на\0
. Затем он переходит в цикл, который считывается до новой строки или EOF, который должен быть немедленно остановлен. Затем следующийfgets()
вернетNULL
. 22.06.2018