我是C语言的新手并且正在开发一个小程序。
实际上我正在尝试使用scanf从用户那里获取字符串。但每当我输入带空格的字符串时,程序一直运行无限,我不得不按停止按钮。我在网上看到了一些例子,我也使用过这些例子,但那给了我一个新的错误。
这是我的代码
struct student s1;
char input[MAX_NAME_SIZE];
printf("Enter name>");
scanf("%s",input);
if(strlen(input) > 10)
{
int l;
for(l = 0 ;l < 10;l++)
s1.name[l] = input[l];
}
int error = 0;
do
{
if(error == 1)
printf("Invalid day. ");
printf("Enter birthday: day>");
scanf("%u",&s1.birthday.day);
error = 1;
}while(s1.birthday.day < 1 || s1.birthday.day > 31); //checking the criteria
我也使用了scanf(&#34;%[^ \ n] s,输入)但是它跳过scanf并转到第二个scanf。
请帮忙
答案 0 :(得分:1)
而不是使用
scanf("%s",input);
你可以使用
gets(input);
它是cstring
头文件的功能,并且工作原理相同。
您可能会遇到此问题,因为scanf
仅接受以空格分隔的字符串。 gets
接受一个完整的单行,因此它可以解决您的问题。
希望这会奏效!
EDIT1:刚从其中一条评论中得到它。
使用fgets()
代替。因为gets()
不提供缓冲区溢出保护。
答案 1 :(得分:0)
正如我在第一条评论中暗示的那样,问题是scanf
只读取空格分隔的“字词”。
这意味着当你给一个带有空格的字符串作为输入时,scanf
将读取空间的第一部分,并将剩下的输入留在缓冲区中。然后当您在循环中输入时,scanf
将看到它不是数字,并且无法从缓冲区中提取输入,使输入保持不变,因此循环的下一次迭代scanf
将尝试读取和解析与上一次迭代完全相同的输入,从而导致无限循环。
您的代码还存在其他问题,例如您实际上没有检查scanf
是否失败(请点击a scanf
(and family) reference的链接并阅读其返回的内容),并且不会突破如果设置了error
,则循环播放。
答案 2 :(得分:0)
我永远不会建议您使用scanf作为多个单词的输入。 getline()将是进入整条生产线的最佳选择(等迈克迈尔斯13/04/85)并且它非常安全。你也得到空终止字符串。
您可以使用此功能,例如:
char *input(char *output)
{
char *Buffer = NULL;
size_t size = 0;
int count = 0;
printf("%s", output);
count = getline(&Buffer, &size, stdin);
Buffer[count-1] = '\0';
return Buffer;
}
在你的情况下,最好像这样使用它:
s1->name=input("Enter the name");
s1->birthday=input("Enter the birthday");
或者你可以输入整行并使用strtok()来解析它。