Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.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#U s不';t在Visual Studio C+中使用printf+;2010年快车_C_Visual Studio 2010 - Fatal编程技术网

scanf#U s不';t在Visual Studio C+中使用printf+;2010年快车

scanf#U s不';t在Visual Studio C+中使用printf+;2010年快车,c,visual-studio-2010,C,Visual Studio 2010,我写了以下代码: #include <stdio.h> int main(void) { char input[50]={0}; scanf_s("%s",input); printf("%s",input); return 0; } 第一行是我的输入,这是调试模式下的屏幕: abcd abcdPress any key to continue . . . 当我使用scanf而不是scanf_时,它会在调试和发布模式下打印。我遗漏了什么?此版本的s

我写了以下代码:

#include <stdio.h>
int main(void)
{
    char input[50]={0};
    scanf_s("%s",input);
    printf("%s",input);
    return 0;
}
第一行是我的输入,这是调试模式下的屏幕:

abcd
abcdPress any key to continue . . .

当我使用scanf而不是scanf_时,它会在调试和发布模式下打印。我遗漏了什么?

此版本的
scanf()
还需要一个参数,正确的调用方法是

scanf_s("%49s", input, 50);
而且,
scanf()
返回一个值,您不应该忽略它,永远不要忽略它

if (scanf_s("%49s", input, 50) == 1)
    printf("%s\n", input);

另外,添加
'\n'
以刷新输出流,而不需要
fflush()
,并通过警告使编译器尽可能恼人。

@V.T.T.Pham。不是,但请习惯使用它,因为它可以防止问题,总是编写安全的代码,你会很高兴……第三个参数是用来防止缓冲区溢出的,对吗?@CoolGuy是的,但如果你检查一下,他们仍然使用长度说明符。你的答案非常有用。我希望我能投赞成票。但我只有1点声誉…@mafso我不知道,但我测试过,它没有崩溃。它只给出一个空字符串(输入[0]=0)。关键因素是printf实际上正在打印到一个缓冲区中,最终,该缓冲区被传递到终端。有许多方法可以强制实际打印缓冲区。1) 用“\n”结束格式字符串2)用fflush(stdout)跟随printf 3)从终端执行输入功能。为了便于提示,1)应始终检查scanf(和系列)返回的值,以确保输入/转换成功。2) 代码对输入字符串的长度没有限制,因此可能会发生缓冲区溢出。建议使用:'if(1!=scanf_s(“%49s”,input){handle error}',实际上,使用fscanf()会比scanf_s更好,因为fscanf无处不在,scanf_s是not@user3629249哇,太令人印象深刻了。我从你们身上学到了很多。非常感谢。但当你们说“fscanf无处不在”时,这是不是意味着“无处不在”?@user3629249顺便问一句,我能用fscanf完全取代scanf吗?[对Iharob答案中的评论作出反应]我们正在劫持Iharob的答案。问一个关于输入中的
fgets
和0字节问题的新问题(之前找一个副本,我找不到,尽管我不敢相信没有,这是一个众所周知的问题);找20个代表,这样我们就可以将讨论转移到聊天;或者我们跟随聊天,我从未尝试过,但如果它有效,我很感兴趣;)
if (scanf_s("%49s", input, 50) == 1)
    printf("%s\n", input);