c - 为什么我不能使用 C 打印此文件中的整个消息?
问题描述
char message[500];
printf("\nEnter your message (Not more than 500 words)\n->");
scanf("%s", message);
FILE *ptr;
ptr = fopen("file.txt", "w");
fprintf(ptr, message);
fclose(ptr);
在这里,我创建了一个名为 message 的数组,在接收到用户的输入后,我将存储的字符串打印到名为 'file.txt' 的文件中,但事实证明只有消息数组的第一个单词在文件中打印。例如:如果我在消息数组中输入“Hello there, I am learning C”并将其打印到文件中,那么文件上只会打印“hello”。请详细解释。
解决方案
切勿在没有最大字段宽度的情况下在 scanf 中使用%s
,否则您很可能会溢出缓冲区。使用%s
并不比gets
.
您遇到的问题只是%s
读取到第一个空格。如果您想使用所有输入,您可能应该使用fread
而不是scanf
. 那是:
char message[500];
printf("\nEnter your message (Not more than 500 characters)\n->");
size_t s = fread(message, 1, sizeof message - 1, stdin);
message[s] = '\0';
如果您只想阅读一行文本,可以使用fgets
. 如果您想使用 scanf 仅读取一行,您可以这样做:(scanf("%499[^\n]", message);
请注意,这与%499s
它不会丢弃前导空格,并且仅在第一个换行符而不是第一个空格字符处停止。)如果你想用来scanf
读取整个输入流,你可以尝试类似的东西scanf("%499[^\1]", message);
,这可能足以用于文本输入。
无论您使用哪种输入法,请务必检查返回值。如果scanf
未能分配输入项(例如,因为输入与格式字符串不匹配),则读取该项可能会调用未定义的行为。如果fread
返回 0 或(在这种情况下)499,您将需要添加逻辑来决定要做什么。
推荐阅读
- python - 向Hbase插入数据的最快方法是什么?
- android - 如何以编程方式在双卡移动的情况下为双卡获取 CID 和 LAC?
- eclipse-hono - 在 Eclipse-hono 中使用通配符订阅所有租户
- ios - 从基类转换子类,其中子类在 Swift 中具有泛型
- google-analytics-api - 什么情况下会出现这个错误“Restricted dimension(s): ga:userAgeBracket, ga:userGender can only be queried in certain conditions”?
- javascript - 在另一个函数正在执行时阻止函数调用
- kubernetes - Docker 多阶段
- amazon-cloudfront - AWS Route 53 加权路由到两个云端分布
- python - 如何将值写入many2many字段
- c++ - 是否应该避免从非常量迭代器到常量迭代器的转换?