处理scanf和printf中的空格

时间:2015-05-04 16:01:50

标签: c

我正在尝试提出一个C程序,它可以接受scanfprintf中的空格,例如姓和名,作为我正在阅读的自学文本的一部分

我很清楚缓冲区溢出可能性以及这些基本/旧函数的安全问题,但这仅限于学习目的,所以我确实需要坚持使用它们。

我的程序如下:

#include <stdio.h>
#include <conio.h>

int main(void)
{
    char name[30];

    printf("Type your name\n");

    scanf("%10[0-9a-zA-Z]", name);

    printf("%s\n", name);
    return 0;
}

并且在编译之后能够读入带有空格的字符串,但我只能打印第一个文本块:

C:\Users\hackr>g++ -o whitespace.exe whitespace.c

C:\Users\hackr>whitespace.exe
Type your name
John Doe
John

C:\Users\hackr>

2 个答案:

答案 0 :(得分:2)

scanf("%29[0-9a-zA-Z ]", name);
                    ^

您忘记在正则表达式中为可接受的字符添加空格。此外,如果您的缓冲区是30个字节,您应该接受29个字符,而不是10.为NUL字符留出空间。

另一件需要注意的事情是,下次您从stdin阅读时,它会读取该行中scanf前30个字符内的字符从下一个提示中读取输入。要解决此问题,请在scanf

之后添加
while (getchar() != '\n')
    ; // read input to end of line

这将始终有效,因为'\n'不在正则表达式的可接受字符中,因此它将保留在stdin缓冲区中。

答案 1 :(得分:1)

试试这个

@Mocked(strictly = true)

这将读取直到遇到换行符。