使用 char,转换为 int 作为数组索引以在文本文件中存储 "chars" 的频率
using char, cast to an int as array index to store frequency of "chars" in a textfile
我正在编写一个简单的程序来存储文本文件中各种符号的出现次数。我正在使用 fgetc() 和一个文件指针从这个文件中读取。一次一个字符。我像这样在我的方法之外设置我的数组
int frequency[MAX_SYMBOLS] = {0};
MAX_SYMBOLS 被定义为 255。然后我阅读并尝试计算每次下面出现的特定字符是我的方法 set_frequency()
void set_frequency()
{
int count = 0;
char c;
FILE *fp = fopen("file.txt","r");
while((c = fgetc(fp)) != EOF)
{
if(c != ' ' && c != '\n')
{
frequency[(int) c]++;
count++;
}
}
fclose(fp);
}
我目前遇到一个分段错误,但不完全确定为什么?
我认为这是数组索引的问题。或者可能是我的文件的大小,因为它相当大。如果有人能提供帮助,那就太好了,因为老实说,我对 c 不是很好。
编辑
'c' 变量需要是 int 而不是 char,因为它是从 fgetc() 函数返回的。那么我就不必输入索引值了!!
除了 EOF
无法放入 char
之外,您还有 2 个潜在问题:
- MAX_SYMBOLS 小于 255,这是你可以使用平面 ascii 找到的字符。
char
是有符号整数。如果你读到大于 0x7f 的内容,它将被转换为负数数组索引。
尝试使用整数读取以满足 EOF 的要求。您还将得到保证代码永远不会为负数,但在 0-255 范围内。
void set_frequency()
{
int count = 0;
int c;
FILE *fp = fopen("file.txt","r");
while((c = fgetc(fp)) != EOF)
{
if(c != ' ' && c != '\n')
{
frequency[c]++;
count++;
}
}
fclose(fp);
}
如果碰巧您必须使用字符来解决类似问题,请使用强制转换来强制使用无符号值:
frequency[(int)(unsigned char) c]++;
我正在编写一个简单的程序来存储文本文件中各种符号的出现次数。我正在使用 fgetc() 和一个文件指针从这个文件中读取。一次一个字符。我像这样在我的方法之外设置我的数组
int frequency[MAX_SYMBOLS] = {0};
MAX_SYMBOLS 被定义为 255。然后我阅读并尝试计算每次下面出现的特定字符是我的方法 set_frequency()
void set_frequency()
{
int count = 0;
char c;
FILE *fp = fopen("file.txt","r");
while((c = fgetc(fp)) != EOF)
{
if(c != ' ' && c != '\n')
{
frequency[(int) c]++;
count++;
}
}
fclose(fp);
}
我目前遇到一个分段错误,但不完全确定为什么? 我认为这是数组索引的问题。或者可能是我的文件的大小,因为它相当大。如果有人能提供帮助,那就太好了,因为老实说,我对 c 不是很好。
编辑
'c' 变量需要是 int 而不是 char,因为它是从 fgetc() 函数返回的。那么我就不必输入索引值了!!
除了 EOF
无法放入 char
之外,您还有 2 个潜在问题:
- MAX_SYMBOLS 小于 255,这是你可以使用平面 ascii 找到的字符。
char
是有符号整数。如果你读到大于 0x7f 的内容,它将被转换为负数数组索引。
尝试使用整数读取以满足 EOF 的要求。您还将得到保证代码永远不会为负数,但在 0-255 范围内。
void set_frequency()
{
int count = 0;
int c;
FILE *fp = fopen("file.txt","r");
while((c = fgetc(fp)) != EOF)
{
if(c != ' ' && c != '\n')
{
frequency[c]++;
count++;
}
}
fclose(fp);
}
如果碰巧您必须使用字符来解决类似问题,请使用强制转换来强制使用无符号值:
frequency[(int)(unsigned char) c]++;