c - 如何使用 scanf() 保存包含多个单词的字符串
问题描述
我刚开始用 C 编程,我想知道为什么我不能用 scanf() 存储一个包含多个单词的字符串。
例如,我输入:“That's an example”,它只存储第一个单词“That's”
我的代码:
int main(void) {
char string[100];
printf("Please enter something: ");
scanf("%s", &string);
printf("You entered: %s", string);
return (0);
}
解决方案
您可以scanf()
使用字符类转换说明符读取多个单词:%[^\n]
将在换行处停止并使其在输入流中挂起。请注意,您必须告知scanf
要存储到目标数组中的最大字符数,以避免在长输入行上出现未定义的行为。将数组传递给 时scanf()
,不应将其地址传递为&string
,而应将其作为 传递string
,当作为函数参数传递时,数组衰减为指向其第一个元素的指针。
这是修改后的版本:
#include <stdio.h>
int main(void) {
char string[100];
int c;
for (;;) {
printf("Please enter something: ");
/* initialize `string` in case the `scanf()` conversion fails on an empty line */
*string = '\0';
if (scanf("%99[^\n]", string) == EOF)
break;
printf("You entered: %s\n", string);
/* read the next byte (should be the newline) */
c = getchar();
if (c == EOF) /* end of file */
break;
if (c != '\n')
ungetc(c, stdin); /* not a newline: push it back */
}
return 0;
}
但是请注意,fgets()
用于此任务要简单得多:
#include <stdio.h>
int main(void) {
char string[100];
for (;;) {
printf("Please enter something: ");
if (!fgets(string, sizeof string, stdin))
break;
/* strip the trailing newline, if any */
string[strcspn(string, "\n")] = '\0';
printf("You entered: %s\n", string);
}
return 0;
}
推荐阅读
- r - R:将“group_by”与“nls()”一起使用
- java - 使用 Apache Commons vfs2(spring boot)的 SFTP 文件传输失败并出现 IOException:错误
- terraform - Terraform:如何处理可选输入变量
- terraform - 使用外部数据从 terraform 中的 bash 脚本接收变量
- python - 如何按月分隔此数据框列?
- node.js - 响应 sgMail.send 的自定义参数
- docker - 如何在远程 docker 主机上部署本地 docker 映像?
- java - 如何使用spring boot在没有模型或实体的情况下将mysql数据库表中的数据读入elasticsearch
- reactjs - 如何在不重新验证的情况下从提取之间的 useSWR 派生“加载”?
- javascript - 为什么我在 React 中的函数被调用了两次但执行不均?