c - 从标准输入读取变量输入

标签 c input stdin

我怀疑我是否有这样的输入:

5 4
1 2 3 4 5
2 3 4
2 3
1 2 3

第一个数字表示不同的“玩具”,每个 child 都对应于第二个数字,即四,因此代表每个 child 和他们想要的玩具的行数......

我如何在 ansi C 中读取这样的输入? 使用strtok?或者还有其他更简单的方法吗?

我可以用这样的东西来做

char line [250];
char * tok;
char *ptr = line;


while((scanf("%s",line)!= EOF){

    while ((tok = strtok(ptr, " ")) != NULL)
    {
        pseudo part
        //convert to int
        //add to array

    }

}

但是有没有更简单的方法可以在不使用 tok 的情况下进行此输入? 谢谢...

最佳答案

推荐一个经典的fgets()/sscanf()组合。

一次读一行。良好的错误检查可用。使用 "%n" 知道下一个玩具的下一次扫描从哪里开始。

char buffer[250];
if (fgets(buffer, sizeof buffer, stdin) == NULL)
  HandleEOF();
int toys, kids;
int cnt = sscanf(buffer, "%d%d", &toys, &kids);
if (cnt != 2 || toys <= 0 || kids <= 0)
  Handle_BadToysKids(cnt);
int kid_wants[kids][toys] = { 0 };

for (int k = 0; k < kids; k++) {
  if (fgets(buffer, sizeof buffer, stdin) == NULL)
    HandleEOF();
  char *p = buffer;
  int want;
  int n;
  while ((cnt = sscanf(p, "%d %n", &want, &n)) == 1) {
    if (want <= 0 || want > toys)
      Handle_BadWant(want);
    kid_wants[k][want - 1] = 1;
    p += n;
  }
}

改进:
使用 size_t toys, kids"%zu"
使用哨兵检查线路上是否有多余的垃圾:
int ch; int cnt = sscanf(buffer, "%d%d %c", &toys, &kids, &ch);
检查 while 循环末尾的 *p - 它应该是 '\0'

关于c - 从标准输入读取变量输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22467459/

相关文章:

javascript - 如何引用日历表单中的输入日历弹窗?

c - 打印标准输入中的每一行

PHP标准输入?

mysql - 如何自动化地将密码安全地传递给 MySQL 客户端

c++ - 从 C++ 调用 C 函数, "no matching function"错误

输入变量的类型冲突?我的功能使用得当吗?

python - C/Python WinPCap 翻译

c++ - 如果我们对所有 C/C++ 文件使用统一的扩展名 (.c/.cpp),会有什么不同?

javascript - Jquery自动完成键盘导航设置输入值,如何更改字段?

java - 如何在java中扫描 ':'分隔整数输入?