Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中读取引号之间有空格的用户输入字符串_C - Fatal编程技术网

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

在C中读取引号之间有空格的用户输入字符串,c,C,我必须阅读如下用户输入: 1 "string with space between quotes" 9.99 我想将输入开头的数字存储到整数变量中,引号之间的字符串存储到字符串中,数字存储在双变量中。我使用fgets获取字符串,但问题是fgets函数一直在读取用户输入,直到我键入0,并且输入末尾的数字与字符串一起。scanf函数也不做这项工作,因为它在第一个空格处停止读取。我的代码如下所示: #include <stdio.h> int main () { int code;

我必须阅读如下用户输入:

1 "string with space between quotes" 9.99
我想将输入开头的数字存储到整数变量中,引号之间的字符串存储到字符串中,数字存储在双变量中。我使用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个输入必须在同一行,您对如何分别读取和存储这3个输入有何想法

if (scanf("%d \"%49[^\"]\" %lf", &x, y, &z) == 3)
    …process valid data…
else
    …report erroneous input…

您的相关部分是%49[^\];它匹配一个字符串,直到遇到该字符串或其空间不足为止。请注意,这不会将包含到字符串中。

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个非“\”字符,保存在描述中并追加“\0” %lf扫描并抛出空格,扫描并保存双精度
%n将扫描的当前偏移量保存到n.

scanf%d\%[^\]\%lf,&x,y,&z;请注意,这将不包括@robin.koch,我认为它不会处理字符串中的空格?%[^\]表示匹配,直到@or1426,您是否只需要在行的内容始终正确时处理,还是需要能够处理它们是错误的,例如缺少双引号或缺少一个数字,还是行中有额外的字符?换一种方式问,输入是来自人类,还是来自程序?描述数组的大小(50)是由您正在尝试执行的规范决定的,还是一个初始估计?使用fgets+sscanf更好,可以对输入验证进行大量控制。