Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
scanf和printf中的空白处理_C - Fatal编程技术网

scanf和printf中的空白处理

scanf和printf中的空白处理,c,C,我正在尝试设计一个C程序,它可以接受scanf和printf中的空格,例如名字和姓氏,作为我正在阅读的自学文本的一部分 我很清楚这些基本/旧函数可能存在缓冲区溢出和此类安全问题,但这只是为了学习,所以我需要坚持使用它们 我的程序看起来像: #include <stdio.h> #include <conio.h> int main(void) { char name[30]; printf("Type your name\n"); scanf

我正在尝试设计一个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;
}
您忘记在正则表达式中的接受字符中添加空格。此外,如果缓冲区为30字节,则应接受29个字符,而不是10个字符。为NUL角色留出空间

另一件需要注意的事情是,下次从
stdin
读取时,它将读取该行中不在
scanf
前29个字符内的字符,然后再开始从下一个提示符读取输入。要解决此问题,请将此添加到
scanf
之后:

while (getchar() != '\n')
    ; // read input to end of line
这将始终有效,因为正则表达式的
'\n'
不在可接受的字符中,因此它将保留在
stdin
缓冲区中

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

另一件需要注意的事情是,下次从
stdin
读取时,它将读取该行中不在
scanf
前29个字符内的字符,然后再开始从下一个提示符读取输入。要解决此问题,请将此添加到
scanf
之后:

while (getchar() != '\n')
    ; // read input to end of line
这将始终有效,因为正则表达式的
'\n'
不在可接受的字符中,因此它将保留在
stdin
缓冲区中

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

另一件需要注意的事情是,下次从
stdin
读取时,它将读取该行中不在
scanf
前29个字符内的字符,然后再开始从下一个提示符读取输入。要解决此问题,请将此添加到
scanf
之后:

while (getchar() != '\n')
    ; // read input to end of line
这将始终有效,因为正则表达式的
'\n'
不在可接受的字符中,因此它将保留在
stdin
缓冲区中

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

另一件需要注意的事情是,下次从
stdin
读取时,它将读取该行中不在
scanf
前29个字符内的字符,然后再开始从下一个提示符读取输入。要解决此问题,请将此添加到
scanf
之后:

while (getchar() != '\n')
    ; // read input to end of line
这将始终有效,因为正则表达式的
'\n'
不在可接受的字符中,因此它将保留在
stdin
缓冲区中。

请尝试此操作

scanf("%29[^\n]", name);
这将一直读取,直到遇到换行符。

请尝试此操作

scanf("%29[^\n]", name);
这将一直读取,直到遇到换行符。

请尝试此操作

scanf("%29[^\n]", name);
这将一直读取,直到遇到换行符。

请尝试此操作

scanf("%29[^\n]", name);

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

这也行!这可能是一种更好的方法,因为它更简单。谢谢
scanf(“%[^\n]”,name)
不会将任何内容扫描到
name
,如果第一个键是,则会使其处于未初始化状态。我将不得不掷硬币决定这两个解决方案中的哪一个被接受,因为它们都是非常好的答案,并且是同时编写的。@Hack-R如果您愿意使用此选项,请使用
scanf(%29[^\n],“name”)这样可以避免缓冲区溢出。@PatrickRoberts,是的,我不知道为什么我以前没有想到这一点。谢谢这也行!这可能是一种更好的方法,因为它更简单。谢谢
scanf(“%[^\n]”,name)
不会将任何内容扫描到
name
,如果第一个键是,则会使其处于未初始化状态。我将不得不掷硬币决定这两个解决方案中的哪一个被接受,因为它们都是非常好的答案,并且是同时编写的。@Hack-R如果您愿意使用此选项,请使用
scanf(%29[^\n],“name”)这样可以避免缓冲区溢出。@PatrickRoberts,是的,我不知道为什么我以前没有想到这一点。谢谢这也行!这可能是一种更好的方法,因为它更简单。谢谢
scanf(“%[^\n]”,name)
不会将任何内容扫描到
name
,如果第一个键是,则会使其处于未初始化状态。我将不得不掷硬币决定这两个解决方案中的哪一个被接受,因为它们都是非常好的答案,并且是同时编写的。@Hack-R如果您愿意使用此选项,请使用
scanf(%29[^\n],“name”)这样可以避免缓冲区溢出。@PatrickRoberts,是的,我不知道为什么我以前没有想到这一点。谢谢这也行!这可能是一种更好的方法,因为它更简单。谢谢
scanf(“%[^\n]”,name)
不会将任何内容扫描到
name
,如果第一个键是,则会使其处于未初始化状态。我将不得不掷硬币决定这两个解决方案中的哪一个被接受,因为它们都是非常好的答案,并且是同时编写的。@Hack-R如果您愿意使用此选项,请使用
scanf(%29[^\n],“name”)这样可以避免缓冲区溢出。@PatrickRoberts,是的,我不知道为什么我以前没有想到这一点。谢谢