我的目标很简单。向用户索要包含大小写字母、数字和标点符号的简单文本文件。然后拿出文件,打开它,扫描前面提到的每个元素,并对每个元素进行计数。最后,输出每个字符的总数(即包含的大写字母总数、小写字母总数、数字总数和标点符号总数)。
不幸的是,我的问题并不是那么简单。我真的很困惑(例如,在概念和语法上)C如何将输入文件传递给fgetc等函数,然后测试它以增加计数器。我的程序崩溃了,我也不知道为什么。我想我最初的问题是,为什么它会崩溃?我的代码如下;
#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;
}
发布于 2012-08-12 19:39:10
#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函数调用移到了循环之外。
发布于 2012-08-12 19:24:54
您在while测试中将fgetc
的结果赋值给FILE *fp
:
while((fp = fgetc(fp)) != EOF)
这可能是导致崩溃的原因。调用fopen
之后,fp
是文件的句柄,之后只需将其传递给接受FILE *
的函数,如fgetc
和fclose
。
另外,您将调用fgetc
两次:一次在while
测试中,然后紧接着在另一个while
测试中。这样会丢失字符,即使在修复fp
问题之后也是如此。为什么需要内循环?
发布于 2012-08-12 19:25:33
man fgetc告诉
fgetc()从流中读取下一个字符,并将其作为无符号字符转换返回给int,或在文件或错误结束时返回EOF。
必须使用int变量来存储此结果
https://stackoverflow.com/questions/11925144
复制