我必须读取如下所示的用户输入:
1 "string with space between quotes" 9.99
我想将输入开头的数字存储到一个整型变量中,将引号之间的字符串存储到一个字符串中,并将数字存储到一个 double 变量中。我正在使用 fgets()
获取字符串,但问题是 fgets()
函数一直读取用户输入,直到我键入 0 和末尾的数字输入与字符串一起。 scanf 函数也不起作用,因为它在第一个空格处停止读取。我的代码如下所示:
#include <stdio.h>
int main () {
int code;
char description[50];
double value;
printf("Type in: ");
scanf("%d", &code);
fgets(description, 50, stdin);
scanf("%lf", &value);
printf("%d\n", code);
printf("%s\n", description);
printf("%2.2f", value);
}
考虑到这 3 个输入必须位于同一行,对于如何分别读取和存储它们有什么想法吗?
最佳答案
OP 的方法希望使用 fgets()
读取一行的一部分,然而 fgets()
一直读取到行尾 '\遇到 n'
。
使用 fgets()
读取整个行,然后解析。
使用 "%n"
是查看整个字符串是否按预期解析的简单方法。
int code;
char description[50];
double value;
#define MAX_LINE_SIZE (20 + 2 + sizeof description + 2 + 20 + 2)
char line[MAX_LINE_SIZE];
printf("Type in: ");
fflush(stdout);
fgets(line, sizeof line, stdin);
int n = 0;
sscanf(line, "%d \"%49[^\"]\"%lf %n", &code, description, &value, &n);
if (n == 0 || line[n] != '\0') {
fputs("Input formatted incorrectly\n", stderr);
return 1;
}
printf("%d\n", code);
printf("\"%s\"\n", description);
printf("%2.2f", value);
"%d\"%49[^\"]\"%lf %n"
详细信息
"%d"
扫描并抛出空格,扫描并保存整数
""
扫描并抛出任何空格
"\""
扫描并匹配一个'\"'
"%49[^\"]"
最多扫描49个不是'\"'
的字符,保存在description
中并追加'\0'
"%lf"
扫描并抛出空格,扫描并保存 double
"%n"
将扫描的当前偏移量保存到 n
中。
关于c - 在 C 中的引号之间读取带有空格的用户输入字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32939045/