Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 这是缓冲区溢出吗?_C_Buffer Overflow_Fflush - Fatal编程技术网

C 这是缓冲区溢出吗?

C 这是缓冲区溢出吗?,c,buffer-overflow,fflush,C,Buffer Overflow,Fflush,如果我的程序按预期的方式运行,我真的很困惑。这不是家庭作业,只是我正在写的一个有趣的三月疯狂预测程序 char buffer[20]; char team1_name[20]; // 18 chars + new line + null char team2_name[20]; printf("Who is team 1?\n"); fgets(buffer, sizeof(buffer), stdin); strncpy(team1_na

如果我的程序按预期的方式运行,我真的很困惑。这不是家庭作业,只是我正在写的一个有趣的三月疯狂预测程序

    char buffer[20];
    char team1_name[20];    // 18 chars + new line + null
    char team2_name[20];

    printf("Who is team 1?\n");
    fgets(buffer, sizeof(buffer), stdin);
    strncpy(team1_name, buffer, sizeof(team1_name));
    team1_name[strlen(team1_name) - 1] = '\0';

    printf("\nWho is team 2?\n");
    fgets(buffer, sizeof(buffer), stdin);
    strncpy(team2_name, buffer, sizeof(team2_name));
    team2_name[strlen(team2_name) - 1] = '\0';

    printf("\nEnter %s's info:\n", team1_name);
出于好奇,我输入了一个超过20个字符的团队名称,它完全跳过了第二个print语句。我是否在防止缓冲区溢出?是否由用户决定不放一些大的东西?我需要同花顺报表吗

这是输出:

    Who is team 1?
    wjefowiejfwoiejfweoifjweoifjweofijweoifj

    Who is team 2?

    Enter wjefowiejfwoiejfwe's info:
    Wins in last 12:

    Losses in last 12:

    Points per game:

问题是,由于您的输入在第一个fgets中被截断(您有20多个字符),因此第二个fgets将从stdin读取第一个输入字符串的末尾

显示“team2\u name”值以查看它(它包含team1\u name中前20个字符后的字符)

对不起,下面的评论是错误的。算了吧:
是的,fgets必须使用sizeof(buffer)-1,因为这个参数是读取的最大字符数。因此,如果读取sizeof(buffer)字符,则需要sizeof(buffer)+1个字符来存储它们(包括尾随的“\0”)

您从stdin中读取了20个字符,但其余的输入仍然保留在流中。下一个
fgets
读取那些剩余的字符,因此Team1被称为
wjefowiejfwoiejfwe
,Team2被称为
oifjweofifj
。打印第2组的名字,你会发现这是真的。

你的
fgets
行只读取你告诉他们的字符数。如果用户输入的内容不止这些,他们会留下来参加下一个
fgets
@DavidSchwartz,所以我对此无能为力???@Tim:继续阅读,直到你拿到新行,然后问你的下一个问题。这不是火箭科学,而是基本的输入处理。最简单的解决方案是将行读入更大的缓冲区,比如128字节。这将确保你消费整个产品线,除非用户真的疯了。你也可以一个字符一个字符地读,直到你读到一行结尾,但这似乎有点过分了。C语言中是否有防止fgets溢出的方法?一些忽略额外字符并允许用户输入团队2的名称的东西?我认为您必须自己编写一个函数。不,这是一项复杂的任务,您只需检查返回的字符串中是否包含“\n”。如果不是这样,则必须继续调用fgets(到另一个缓冲区中),直到找到“\n”。(fgets在读取字符数-1或a\n时停止,以先到者为准)。好的,我终于得到了它。我不明白fgets需要换行。我在想printf和\n处理了它,fflush也没有做任何事情。嘲笑我说这不是火箭科学也没用。