使用fgets()从键盘读取时读取前一个输入的换行符

时间:2017-07-28 20:15:37

标签: c++

我在使用fgets()读取用户输入时遇到问题,当我尝试读取输入并点击输入时会影响下一个输入,它会自动读取新行字符并混淆一切。这里的一些人告诉我使用strcspn()函数去掉那个新行字符。但它仍然不适合我。更具体的说,年龄字段是有问题的,我将年龄字符数组设置为4,因为最大年龄是3位数,我们需要一个空字符的额外空格。当我使用带有年龄字段的fgets()时,我也读了4个字符,最多3个字符用于年龄,最后一个字符串终止,但它不起作用,我无法弄清楚如何要解决这个问题。

struct Person {

    char name[20];
    char age[4];

};

int main(){

    vector<Person> v;

    for (unsigned int i = 0; i < 5; i++) {

        Person p;
        printf("Enter a name and age:\n");
        printf("Name: ");
        fgets(p.name, 20, stdin);
        p.name[strcspn(p.name,"\n")] = '\0';
        printf("Age: ");
        fgets(p.age, 4, stdin);
        p.age[strcspn(p.age, "\n")] = '\0';


        v.push_back(p);
    }
}

1 个答案:

答案 0 :(得分:0)

fgets( char *str, int count, FILE *stream )从给定的文件流中读取最多count - 1个字符。然后fgets(...,4,...)从流中获取最多3个字符,这比读取3个数字+新行所需的字符少一个。因此,新行仍保留在流中,并由下一个fgets使用,导致空p.name。可以使用age[5]fgets(...,5,...)修正此问题。

然而,主要问题是您的代码容易受到错误&#34; (即,长)用户输入,使得像"123 \n"这样的输入将再次导致意外结果。为了使它更稳定,你可以接受一行中的更多字符,但如果需要则截断输入:

void readin(char* dest, size_t destSize) {
  char input[1000];
  fgets(input, 1000, stdin);
  input[strcspn(input,"\n")] = '\0';
  strncpy(dest,input, destSize);
  dest[destSize-1] = '\0';
}

void main() {
  ...
  readin(p.name,20);
  readin(p.age,4);
  ...
}