Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.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
扫描(%s)不允许空间?C程序设计_C - Fatal编程技术网

扫描(%s)不允许空间?C程序设计

扫描(%s)不允许空间?C程序设计,c,C,可能重复: 上面的代码有两部分,读取整数和字符串 读取整数是可以的 考虑到字符小于64且没有空格,读取字符串也很好 这就是问题所在 scanf只读取一个空格以内的字符 空间消失后的一切 如何在scanf中也包含空格?如果要改为读取一行,请使用fgets(get是不安全的) fgets(inputStr, 64, stdin) 不要使用scanf(“%s”,…),而是使用: fgets(inputStr, 64, stdin) 这是一种更好的做法,因为它不容易受到缓冲区溢出攻击,而且它将读取

可能重复:

上面的代码有两部分,读取整数和字符串

读取整数是可以的

考虑到字符小于64且没有空格,读取字符串也很好

这就是问题所在

scanf
只读取一个空格以内的字符

空间消失后的一切

如何在scanf中也包含空格?

如果要改为读取一行,请使用fgets(get是不安全的)

fgets(inputStr, 64, stdin)

不要使用
scanf(“%s”,…)
,而是使用:

fgets(inputStr, 64, stdin)
这是一种更好的做法,因为它不容易受到缓冲区溢出攻击,而且它将读取整行输入,这似乎是您正在尝试的。请注意,当使用
fgets
时,换行符
\n
也会读入缓冲区(假设整行都能放入缓冲区)

另外,当向函数传递数组时,就像第二个
scanf
调用一样,不需要使用操作符的地址(
&
)。数组的名称(即,
inputStr
)是数组开头的地址。

;如果您想知道为什么不能用
scanf(3)
捕获空白:

s匹配一系列非空白字符;这个
下一个指针必须是指向
足够长以容纳输入序列和
正在终止添加的空字符('\0')
自动地输入字符串在空白处停止
或在最大字段宽度处,以先到者为准。

< /代码> 如果您想继续使用SCANF(例如,如果该字符串只是用SCANF读取的一些输入),则可以考虑使用“扫描集”转换,例如:

scanf("%63[^\n]%*c", inputStr);
fgets
不同,这不包括读取后字符串中的尾随新行。还请注意,在扫描集转换中,指定要读取的字符串的最大长度而不是缓冲区大小,因此需要指定一个小于缓冲区大小的字符串,以便为终止NUL留出空间


我已经包含了“%*c”来阅读,但放弃了新行。新行被视为空白,在scanf转换字符串中特别处理。普通字符只匹配并忽略输入中的该字符,但空格匹配并忽略所有连续的空格。对于交互式输入,这尤其令人恼火,因为这意味着在输入其他空白之前,空白转换不会完成匹配。

是的,tkz很多<代码>fgets
读取空格。但是它也读
\n
。我怎么能省略呢?@william你可以通过以下方式删除
\n
inputStr[strlen(inputStr)-1]='\0'
如果字符串中的最后一个字符是
'\n'
@william,只需将\n更改为\0即可。+1或
scanf(“%63[^\n]”)
@cnicutar虽然我实际上想建议一些人很难阅读它,所以我已经有一段时间没有在生产代码中实际使用它了,并且倾向于避免使用它。但我肯定会+1作为答案:)@cnicutar-虽然这会起作用,但将其结合起来并生成更复杂的
scanf
格式说明符的诱惑太大,在这种情况下错误恢复太困难。我宁愿使用
fgets
/
sscanf
,也不愿使用普通的
scanf
(或
fscanf
)。@ChrisLutz我同意有时候它比多保存一两行代码更容易可读,并且更容易处理后面的换行等等。使用
“%*c”
可能不好-如果用户键入的字符超过63个,它将丢弃最后一个字符(认为这是换行符)。您可以执行
“%*[\n]”
,但您仍然必须使用
scanf
的奇妙(读:可怕)错误检查机制,以查看它是否确实注册了换行符,或者是否有更多挂起的用户输入。@ChrisLutz:完全正确。大多数人只是忽略了额外的内容(或者将其视为一个错误),但是如果你想(例如)扩大分配,并且在他们输入更多内容时阅读更多内容,那么使用scanf比fgets更容易:
scanf(%63[^\n]%c],inputStr,&someChar);if(someChar!='\n')read_more();
scanf("%63[^\n]%*c", inputStr);