c - 使用 scanf() 从括号中读取逗号分隔值

标签 c struct scanf

我有以下输入:

((1828,299),(2729,2553),(2797,2929),(2200,1383),(2894,876))

和以下结构:

struct x{
int a;
int b;
}

如何使用 scanf() 读取输入以创建我的结构数组?

我试过了

scanf("%[^, ()],%d", &arr);
    if (i % 2 == 0){
        arr[i].x = scanf("%d");
    }else
        arr[i].y = scanf("%d");

但是当我试图打印出这些值时,我得到了一些奇怪的字符

最佳答案

错误使用scanf()

  1. scanf("%[^, ()],%d", ...) 期望扫描并形成一个字符串 ("%[^, () ]") 和一个 int ("%d")。代码只提供了一个地方来保存int

  2. 代码没有检查 scanf() 的返回值,因此如果没有发现任何扫描问题则进行编码。

当数据是时,推荐使用fgets()然后解析。可以使用 strtok() strtol() sscanf()。每个都有各种优点/缺点。示例:

#include <limits.h>
#include <stdio.h>
#include <stdlib.h>

#define MAXN (5)
// maximum size needed to print and `int`
#define INTSIZE (sizeof (int )* CHAR_BIT  / 3 + 3)
// Expect buffer size needed
#define EXPECTEDSIZE (1+(2*INTSIZE + 4) + 3)

void fooo() {
  int i;

  struct x {
    int a;
    int b;
  } xx[MAXN];
  char buf[EXPECTEDSIZE * 2]; // I favor 2x size buffers
  while (fgets(buf, sizeof buf, stdin)) {
    char *p = buf;
    if (*p++ != '(') {
      exit(EXIT_FAILURE);
    }
    for (i = 0; i < MAXN; i++) {
      int n; // use %n to locate scan completion
      int cnt = sscanf(p, " (%d ,%d ) %n", &xx[i].a, &xx[i].b, &n);
      fprintf(stderr, "cnt = %d '%s'\n", cnt, p);
      if (cnt != 2) {
        exit(EXIT_FAILURE);
      }
      p += n;
      if (p[0] != ',') {
        if (p[0] == ')') {
          i++;
          break; // Successfully reached the end
        }
        exit(EXIT_FAILURE);
      }
      p++;
    }
    int j;
    for (j=0; j< i; j++) {
      printf("%d  (%d ,%d )\n", j, xx[j].a, xx[j].b);
    }
  }
}

关于c - 使用 scanf() 从括号中读取逗号分隔值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29583743/

相关文章:

c - 在 C 中检查字符串中的数字时遇到问题

c - 代码没有打印出预期的输出,为什么?

swift - 在 Swift 中的 Dispatch 闭包中修改结构实例变量

将 double 值转换为 uint_8 类型数组

c - 指针变量上的 () 在 C 中意味着什么

c - 低电平写入段错误

c - 如何使用带有索引的struct在c中使用文件描述符或系统调用来读写文件和处理文件

c - 指针、字符和 malloc

c - 使用 scanf() 读取多行输入

c - 扫描与数组类型相同的 N 个成员的结构是否安全?