[英]Accepting space in C string input
我是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(“%[^ \\ n] s,input),但是它随后跳过了scanf并转到了第二个scanf。
请帮忙
而不是使用
scanf("%s",input);
您可以使用
gets(input);
它是cstring
头文件的功能,并且工作相同。 您可能会遇到问题,因为scanf
仅接受以空格分隔的字符串。 gets
接受一个完整的单行,因此可以解决您的问题。
希望这会起作用!
EDIT1:刚从评论之一得到它。
使用fgets()
代替。 因为gets()
不提供缓冲区溢出保护。
正如我在第一条评论中所暗示的那样,问题是scanf
仅读取以空格分隔的 “单词”。
这意味着当您输入一个带有空格的字符串作为输入时, scanf
会读取直到该空格的第一部分,并将其余的输入保留在缓冲区中。 然后,当您在循环中进行输入时, scanf
会发现它不是数字,并且无法从缓冲区中提取输入,而输入保持不变,因此循环的下一次迭代scanf
将尝试读取并解析精确的与上次迭代相同的输入,导致无限循环。
您的代码还存在其他问题,例如您实际上没有检查scanf
失败(遵循指向scanf
(和系列)引用的链接并了解返回的内容),并且如果设置了error
,也不会中断循环。
我绝不建议您使用scanf来输入多个单词。 getline()将是输入整行的最佳选择(例如Mike Myers 13/04/85),它非常安全。 您还会得到以null结尾的字符串。
您可以使用此功能,例如:
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()对其进行解析。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.