【问题标题】:Parsing in a particular number解析特定数字
【发布时间】:2011-03-06 17:32:26
【问题描述】:

我知道这是一个基本问题......但我已经坚持了一个小时。我对C有点陌生。我一直在尝试从以特定方式定位的文本文件中解析一些整数。这是一个例子:

A 123,1

B 456,2 

N 980,2

我想扔掉字母和逗号后面的数字。因此,我只有 123、456 和 980。我一直卡在第一部分(扔掉字母,中间的空白一直困扰着我:()。我知道有很多帖子有点相似,但我似乎无法得到它。这是我到目前为止的代码(test.txt 包含输入值)。

int main(void)
{
    FILE *rFile = fopen ("test.txt", "rt");
    char input[20];

    if (rFile == NULL) {
        printf("Input file could not be located");
        return -1;
    }

    while (fscanf(rFile, "%s \n", input) > 0)
    {
     printf("%s", input);
    }
    fclose(rFile);

    return 0;
}

这显然是不完整的。我解决此问题的方法是获取输入字符串(包括空格),然后使用 strtok 切掉中间部分。但是,我什至无法正确解析文本文件的每一行。

【问题讨论】:

    标签: c string parsing integer


    【解决方案1】:

    scanf 适用于选择性地仅读取输入的一部分。

    int num;
    scanf("%*c %d,%*d",&num);
    printf("%d\n",num);
    

    scanf 忽略 %d 之前的空格并在格式字符串中有一个星号(例如在%*c%*d 中)使其读入然后丢弃该令牌,从而使我们无需指定要存储的变量我们不需要的输入部分。

    【讨论】:

      【解决方案2】:

      scanffscanf 也可以解析单个字符和整数。它忽略实体之前的空格。

      char c ;
      int n1 ;
      int n2 ;
      
      // ...
      
      while (fscanf(rFile, "%c %d,%d ", &c, &n1, &n2) > 0)
      {
          printf("%d\n", n1);
      }
      

      【讨论】:

      • 知道了.. 谢谢!这让它变得更容易..此外,其他帖子同样有价值
      【解决方案3】:

      如果您要加载整行文本,包括空格,您最好使用fgets 而不是fscanf

      char* fgets (char* stringBuffer, int numberOfCharacters, FILE* fileStream);
      

      fgets 将继续阅读,直到满足以下条件之一:

      • 到达换行符
      • 已到达文件末尾
      • 已达到字符数(减一)

      在您的示例中使用 20 个字符的字符串缓冲区,您可以使用如下内容:

      while (fgets(input, 20, rFile)) {
        printf("%s", input);
      }
      

      也就是说,junjanes 解决方案可能仍然更适合您的确切问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-04
        • 1970-01-01
        • 2018-01-01
        相关资源
        最近更新 更多