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

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

考虑到这 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/

相关文章:

c - 单父进程的多个子进程

c - 如何使用指向数组的指针访问未知大小的二维数组

c++ - 来自 Lua 脚本的 nanosleep() 调用暂停了 QT GUI 线程

c - 如何遍历这个由多个结构体、数组和指针组成的 C 数据结构?

c - gcc 如何将 sum 从 1 到 100 优化为 5050

c++ - linux C++ 通知文件类型创建

c - 指针在 printf 后改变值

c++ - cpp 和 C 中非法除以零异常

c - 找出2个相似或不相似的字符串

c - Linux 内核函数 memblock_alloc_range_nid 未出现在地址空间中