【问题标题】:Can't count the digits in the last word in the last line of text file in C无法计算C中文本文件最后一行中最后一个单词中的数字
【发布时间】:2014-10-16 04:00:31
【问题描述】:

我必须写出包含超过 2 位数字的单词数。一切都还好直到最后一行中的最后一个字无法计数。我数不清最后一个单词的数字。代码如下:

while(fgets(row,MAX,fp) != NULL)
{
    int flag = 0; 
    int digits = 0;
    int words = 0;
    for(i = 0; i < strlen(row); i++)
    {
        if(isalpha(row[i]))
        {
            if(!flag)
            {
                flag = 1;
            }
            if(isdigit(row[i]))
            {
                digits++;
            }
        }
        else if(flag)
        {
            flag = 0;
            if(digits > 2)
            {
                words++; //words containing more than 2 digits
            }
            digits = 0;
        }
        printf("%d\n%s",words,row);
    }

}

【问题讨论】:

  • 你在 MAX 中给出的值是多少?我认为, fscanf 在这方面可能更方便。您可以使用它逐字阅读。
  • 如何在 while(fgets(red,100,fp) 循环中使用 fscanf 逐字阅读?
  • 我在下面给出了 fscanf 的例子。
  • 永远不会达到最终(无 alpha)值,因为 fgets() 停止在行尾并在行尾标记的位置插入一个 '\0'。 strlen 也不计算字符串末尾的 '\0' 。因此,循环过早停止一个字符。

标签: c file count digits


【解决方案1】:

fscanf 读取文件。下面只是一个简单的例子。

main ()
{
    char row [ 100];

    FILE *fp = fopen ("/vol/users/test/sample.txt", "r");

    while(fscanf(fp, "%s", row) ==1)
    {
       printf("%s\n",row);
    }

}

【讨论】:

    【解决方案2】:

    在这种情况下-

        if(isalpha(row[i])) // I think yo should use "isalnum(row[i])"
        {
            if(!flag)
            {
                flag = 1;
            }
            if(isdigit(row[i]))
            {
                digits++;
            }
        }
    

    因为如果一个字符不是字母(考虑它是数字),它不会进入它里面。那么它将如何增加digits?。使用isalnum(row[i]) 而不是isalpha(row[i])

    那么我认为剩下的代码工作正常!

    尝试以下更改-

        if(isalnum(row[i])) 
        {
            if(!flag)
            {
                flag = 1;
            }
            if(isdigit(row[i]))
            {
                digits++;
            }
        }
    

    供您参考-

    #include<stdio.h>
    #include<ctype.h>
    #include<string.h>
    #define MAX 100
    int main()
    {
            FILE *fp;
            char row[MAX];
            int i;
            fp=fopen("FileXYZ","r"); // where FileXYZ is the file name
    
            int words = 0;
            while(fgets(row,MAX,fp) != NULL)
            {
                    int flag = 0 ;
                    int digits = 0;
                    for(i = 0; i < strlen(row); i++)
                    {
                            if(isalnum(row[i]))
                            {
                                    if(!flag)
                                    {
                                            flag = 1;
                                    }
                                    if(isdigit(row[i]))
                                    {
                                            digits++;
                                    }
                            }
                            else if(flag)
                            {
                                    flag = 0;
                                    if(digits > 2)
                                    {
                                            words++; //words containing more than 2 digits
                                            printf("%d\n%s",words,row);
                                    }
                                    digits = 0;
                            }
                    }
            }
            return 0;
    }
    

    而文件内容是-

    a3b4cd
    ab4c4d5
    abcd
    2ab3cd
    abcd
    i6k7k8
    h0g9j
    ywer4t
    

    输出-

    root@sathish1:~/My Docs/Programs# ./a.out 
    1
    ab4c4d5 
    2
    i6k7k8
    

    【讨论】:

    • 这是alnum,我在这里写错了:)
    【解决方案3】:

    我认为文件末尾没有非字母字符,所以ELSE块不运行,在文件末尾放置一个非字母字符,像点一样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-11
      • 2015-10-08
      • 2011-11-26
      • 1970-01-01
      • 1970-01-01
      • 2012-07-06
      • 1970-01-01
      • 2017-05-01
      相关资源
      最近更新 更多