我正在尝试提出一个C程序,它可以接受scanf
和printf
中的空格,例如姓和名,作为我正在阅读的自学文本的一部分
我很清楚缓冲区溢出可能性以及这些基本/旧函数的安全问题,但这仅限于学习目的,所以我确实需要坚持使用它们。
我的程序如下:
#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>
答案 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)
这将读取直到遇到换行符。