接受C字符串输入中的空格

时间:2016-05-19 13:29:08

标签: c

我是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。

请帮忙

3 个答案:

答案 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()来解析它。