首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何输入文件并使用它来计算大小写字母、数字和标点符号?

如何输入文件并使用它来计算大小写字母、数字和标点符号?
EN

Stack Overflow用户
提问于 2012-08-13 03:22:40
回答 3查看 6.3K关注 0票数 0

我的目标很简单。向用户索要包含大小写字母、数字和标点符号的简单文本文件。然后拿出文件,打开它,扫描前面提到的每个元素,并对每个元素进行计数。最后,输出每个字符的总数(即包含的大写字母总数、小写字母总数、数字总数和标点符号总数)。

不幸的是,我的问题并不是那么简单。我真的很困惑(例如,在概念和语法上)C如何将输入文件传递给fgetc等函数,然后测试它以增加计数器。我的程序崩溃了,我也不知道为什么。我想我最初的问题是,为什么它会崩溃?我的代码如下;

代码语言:javascript
运行
复制
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>


int main()
{
    char Character = 0;
    int words = 0;
    int upper_case = 0;
    int lower_case = 0;
    int punctuation = 0;
    int digits = 0;
    int entered_words = 0;
    char user_filename[100];
    char user_filecontent[100];



    printf("Enter the filename of the file containing text and/or digits:\n");
    printf("(hit the Enter key when done)\n");
    gets(user_filename);

    FILE *fp;
    fp = fopen (user_filename, "r");


    if (fp == NULL)
    {
        printf("\nError, Unable to open the file for reading\n");
    }


    while((fp = fgetc(fp)) != EOF)
    {


            while((Character=fgetc(fp)) != '\n');
            {

                if (isalnum (Character))
                {
                    if (!entered_words)
                    {
                        entered_words = 1;
                        words++;
                    }
                }


                else
                {
                    if (entered_words)
                    {
                        entered_words = 0;
                    }
                }


                if (isupper(Character))
                {
                    upper_case++;
                }


                else if (islower(Character))
                {
                    lower_case++;
                }


                else if (isdigit(Character))
                {
                    digits++;
                }


                else if (ispunct(Character))
                {
                    punctuation++;
                }

            }

    fclose(fp);
    }

    printf("Total number of words is %d.\n", words);
    printf("Total number of digits are %d.\n", digits);
    printf("Total number of uppercase letters is %d.\n", upper_case);
    printf("Total number of lowercase letters is %d.\n", lower_case);
    printf("Total number of punctuation characters is %d.\n", punctuation);

return 0;
}
EN

回答 3

Stack Overflow用户

发布于 2012-08-13 03:39:10

代码语言:javascript
运行
复制
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>


int main()
{
    char Character = 0;
    int words = 0;
    int upper_case = 0;
    int lower_case = 0;
    int punctuation = 0;
    int digits = 0;
    int entered_words = 0;
    char user_filename[100];
    char user_filecontent[100];



    printf("Enter the filename of the file containing text and/or digits:\n");
    printf("(hit the Enter key when done)\n");
    gets(user_filename);

    FILE *fp;
    fp = fopen (user_filename, "r");


    if (fp == NULL)
    {
        printf("\nError, Unable to open the file for reading\n");
    }


    while((Character = fgetc(fp)) != EOF)
    {

                if (isalnum (Character))
                {
                    if (!entered_words)
                    {
                        entered_words = 1;
                        words++;
                    }
                }


                else
                {
                    if (entered_words)
                    {
                        entered_words = 0;
                    }
                }


                if (isupper(Character))
                {
                    upper_case++;
                }


                else if (islower(Character))
                {
                    lower_case++;
                }


                else if (isdigit(Character))
                {
                    digits++;
                }


                else if (ispunct(Character))
                {
                    punctuation++;
                }
    }

    fclose(fp);

    printf("Total number of words is %d.\n", words);
    printf("Total number of digits are %d.\n", digits);
    printf("Total number of uppercase letters is %d.\n", upper_case);
    printf("Total number of lowercase letters is %d.\n", lower_case);
    printf("Total number of punctuation characters is %d.\n", punctuation);

return 0;
}

我删除了内部的while循环,并将fclose函数调用移到了循环之外。

票数 1
EN

Stack Overflow用户

发布于 2012-08-13 03:24:54

您在while测试中将fgetc的结果赋值给FILE *fp

代码语言:javascript
运行
复制
while((fp = fgetc(fp)) != EOF)

这可能是导致崩溃的原因。调用fopen之后,fp是文件的句柄,之后只需将其传递给接受FILE *的函数,如fgetcfclose

另外,您将调用fgetc两次:一次在while测试中,然后紧接着在另一个while测试中。这样会丢失字符,即使在修复fp问题之后也是如此。为什么需要内循环?

票数 0
EN

Stack Overflow用户

发布于 2012-08-13 03:25:33

man fgetc告诉

fgetc()从流中读取下一个字符,并将其作为无符号字符转换返回给int,或在文件或错误结束时返回EOF。

必须使用int变量来存储此结果

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11925144

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档