在字符串中输入字符,直到下一个是整数--C

时间:2013-12-10 19:24:27

标签: c scanf

我正在努力寻找获得此类输入的最佳方式: “Word1 word2 1 2 3 4 -1” 基本上我想在字符串中保存“This is a string”并将数字添加到变量sum中,直到它们达到-1。

我试过

scanf("%s %s", &string1, &string2);

它无法正常工作。

1 个答案:

答案 0 :(得分:0)

#include <stdio.h>

int main(void)
{
  char line[4096];
  while (fgets(line, sizeof(line), stdin) != 0)
  {
    char name1[32];
    char name2[32];
    int score = 0;
    int offset = 0;
    int length = 0;
    int number;
    if (sscanf(line + length, "%s%n", name1, &offset) != 1)
        break;
    length += offset;
    if (sscanf(line + length, "%s%n", name2, &offset) != 1)
        break;
    length += offset;
    while (sscanf(line + length, "%d%n", &number, &offset) == 1 && number != -1)
    {
      length += offset;
      score += number;
    }
    printf("%s %s %d\n", name1, name2, score);
  }
  return 0;
}

数据文件:

John Smith 1 2 4 5
John Sutton 2 4 6 8 9 -1
Maggie Smith 9 8 9 8 9 9 -1

示例输出:

John Smith 12
John Sutton 29
Maggie Smith 52

如果最后没有-1,你可以将它修复为对象(虽然它确实不需要,见证第一行输入),同样如果有超过6个条目,你可以对象,等

或者,如果您想使用fscanf(),那么您可以这样做(它为给定输入提供与原始版本相同的输出):

#include <stdio.h>

int main(void)
{
  char name1[32];
  char name2[32];
  int score[7];
  int nv;
  while ((nv = fscanf(stdin, "%31s %31s %d %d %d %d %d %d %d",
                name1, name2, &score[0], &score[1], &score[2], &score[3],
                &score[4], &score[5], &score[6])) > 2)
  {
    int total = 0;
    for (int i = 0; i < nv - 2; i++)
    {
        if (score[i] == -1)
          break;
        total += score[i];
    }
    printf("%s %s %d\n", name1, name2, total);
  }
  return 0;
}

请注意,此代码知道已成功读取的数量(nv - 2),并相应地进行。现在你的任务是搞乱数据文件以查看它接受的其他格式,然后决定这是否更好。您还可以使用混合程序,使用fgets()读取一行和sscanf()类似于第二个程序中的fscanf(),以便一次读取所有值。