【发布时间】:2020-02-02 00:35:52
【问题描述】:
在我的代码中,我确保用户输入以下缩写类之一,但是我的 fget 导致我出现很多逻辑错误。
char class[3];
char arr3[5];
i = 0;
while(i == 0){
printf("Enter the class, either FR, SO, JR, SR, GR, RFR, or RSO\n");
fgets(arr3, sizeof(arr3), stdin);
if(sscanf(arr3, "%s", class) == 1){
if(strcmp(class, "FR\0") == 1 || strcmp(class, "SO\0") == 1)
i = 1;
else if(strcmp(class, "JR\0") == 1 || strcmp(class, "SR\0") == 1)
i = 1;
else if(strcmp(class, "GR\0") == 1 || strcmp(class, "RFR\0") == 1)
i = 1;
else if(strcmp(class, "RSO\0") == 1)
i = 1;
else
printf("Enter one of the classes. Must be all caps.\n");
}
else if(sscanf(arr3, "%s", class) != 1)
printf("An error has occured.\n");
}
当我运行代码时,首先发生的是它跳过 fgets 然后打印: 输入其中一个类。必须全部大写。 这是否意味着它正在读取标准输入中已经存在的内容?
【问题讨论】:
-
class[3]太短了,无法将"RFR"或"RSO"保存为字符串('\0'没有空间),因此 Undefined Behavior 结果时您将未终止的class传递给strcmp。进一步的"\0"in ,例如"SO\0"是多余的。 String Literal 已经提供了 nul-termianting。特点。 故事的寓意 -- 不要吝啬缓冲区大小! 此外,如果有的话,在你的代码 sn-p 之前会发生什么,stdin很重要。请提供A Minimal, Complete, and Verifiable Example (MCVE)。