我必须阅读看起来像这样的用户输入:
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);
}
考虑到它们必须在同一条线上,如何分别阅读和存储这三个输入的任何想法?
答案 0 :(得分:4)
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"
扫描&amp;抛空白,扫描并保存整数
" "
扫描并抛出任何空格
"\""
扫描并匹配'\"'
"%49[^\"]"
最多扫描49个不是'\"'
的字符,保存在description
并附加'\0'
"%lf"
扫描&amp;抛出空白,扫描并保存double
"%n"
将扫描的当前偏移量保存到n
。
答案 1 :(得分:3)
if (scanf("%d \"%49[^\"]\" %lf", &x, y, &z) == 3)
…process valid data…
else
…report erroneous input…
相关部分是%49[^\"]
;它会匹配一个字符串,直到遇到"
(或者空间不足)。请注意,这不会将"
包含在字符串中。