读取C中引号之间带有空格的用户输入字符串

时间:2015-10-04 22:29:08

标签: c

我必须阅读看起来像这样的用户输入:

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);
}

考虑到它们必须在同一条线上,如何分别阅读和存储这三个输入的任何想法?

2 个答案:

答案 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[^\"];它会匹配一个字符串,直到遇到"(或者空间不足)。请注意,这不会将"包含在字符串中。