c - 为什么 scanf("%[^\n]s", ...) 不捕获带空格的字符串?
问题描述
我一直在全球搜寻为什么scanf()
不捕获空间,并且通常的解决方案,例如"%[^\n]s"
or "%100s"
(将字符串设置为足够大以捕获输入)并没有奏效。
我的程序的总体目标是提示用户输入一个字符串,然后将该字符串存储在一个 .txt 文件中。我不相信我的问题是由最初的控制台扫描引起的fprintf()
,而是由最初的控制台扫描引起的。
是的,我是初学者,不了解 C 语言的细微差别。对于看似简单的句法错误,我深表歉意。这就是我得到的。
#include <stdio.h>
int main()
{
errno_t inputfile;
FILE *stream;
inputfile = fopen_s(&stream, "inputfile.txt", "w");
printf("%s", "Enter a string. Press ENTER to exit\n");
char c[100];
scanf("%[^\n]s", c);
printf("%100s", c); //using printf() to check if scanf() worked.
//Messing around with specifier to see if problem
//is in printf(), which doesn't seem to be the case.
fprintf(stream, "%s", c);
fprintf(stream, "%s", "ENTER is a correct ending");
fclose(stream);
return 0;
}
任何帮助表示赞赏。
解决方案
scanf("%[^\n]s", c);
不正确,删除s
说明符末尾的,还应该使用宽度限制器以避免缓冲区溢出。
它应该是:
scanf("%99[^\n]", c); // leave 1 character for the null byte
尽管如此,您描述的行为是出乎意料的,您可以在此处看到:
https://godbolt.org/z/enq93MaG5
请注意,我将您的代码转换为一个可重现的最小示例,即,我删除了不必要的代码,这就是您从现在开始应该做的事情。
另请注意,printf("%100s", c);
将字符串向右调整可能会产生不希望的效果,将剩余的字符打印为左侧的空格,例如,具有 10 个字符的字符串将打印 90 个空格,然后打印字符串。
推荐阅读
- python-3.x - 带有 websocket 和 SocketIO 的 Sanic。使用哪一个?
- wolfram-mathematica - 你如何在mathematica中覆盖圆柱体末端附近的圆环?
- linux - Anylogic 文本字段默认“折叠”
- r - 删除重复项和它的内在价值
- python - 使用 __getattr__() 和 __setattr__() 提供多种访问子变量的方法
- python - .py 在第一次双击时不会打开,但是当我已经打开 IDLE shell 时会打开
- sql - 具有函数 ORA-08103 的 Oracle 存储过程
- flutter - 无法在初始化程序中访问实例成员
- aws-lambda - 从 lambda 函数的代码中获取 aws lambda 函数的列表
- python - 芹菜消耗所有队列