gpt4 book ai didi

C. 将 char 十进制值存储到数组无法读取/存储 8 位字符

转载 作者:太空宇宙 更新时间:2023-11-04 01:55:19 24 4
gpt4 key购买 nike

我有一个问题希望你能帮我解决。

我正在尝试从我将对其执行频率分析的文件中读取字符。我决定最简单的方法是拥有一个索引为 0-255 的数组,并在每次读取 char 时将相应的索引(从读取的 chars 十进制值)递增 1。我遇到的问题是似乎只保存了 7 位字符。在下面查看代码。

int frequency(FILE *freqfilep)
{
printf("frequency function called!\n");

int start = 1;
int *frqarray = calloc(256,sizeof(int));
unsigned char tecken;

FILE *fp;
fp = fopen("freqfile.txt","r");

if (fp == NULL)
{
perror("Error in opening file");
start = 0;
}
do
{
tecken = fgetc(fp);

if (feof(fp))
{
start = 0;
}
else
{
frqarray[(int)tecken] ++;
}
}
while (start != 0);

printf("a%d\n", frqarray[97]);
printf("b%d\n", frqarray[98]);
printf("c%d\n", frqarray[99]);
printf("1%d\n", frqarray[49]);
printf("2%d\n", frqarray[50]);
printf("3%d\n", frqarray[51]);
printf("å%d\n", frqarray[134]);
printf("ä%d\n", frqarray[132])
printf("ö%d\n", frqarray[148]);

fclose(fp);

return 0;
}

我正在读取的文件包含以下字符:

aaa bbb ccc 111 222 333 ååå äää ööö

所以我代码底部的 printf 应该是这样的:

a3
b3
c3
13
23
33
å3
ä3
ö3

但是结果是

a3
b3
c3
13
23
33
å0
ä0
ö0

所以我猜测读取 8 位字符存在一些问题,我在论坛上四处看了看,发现了一些相对相似的帖子,答案是我需要使用这样的缓冲区 fread(&buffer, 256, 1, file); 但我不确定如何实现它。

最佳答案

这些字符很可能不是设置了高位的单字节字符,而是多字节字符。

这些字符由以下 UTF-8 代码点表示:

  • å: 0xc3 0xa5(十进制 195 165)

  • ä: 0xc3 0xa4(十进制 195 164)

  • ö: 0xc3 0xb6(十进制 195 182)

将以下内容添加到您的代码中:

printf("195 %d\n", frqarray[195]);
printf("165 %d\n", frqarray[165]);
printf("164 %d\n", frqarray[164]);
printf("182 %d\n", frqarray[182]);

你可能会得到这个输出:

195 9
165 3
164 3
182 3

编辑:

如果需要对字符进行频率分析,请改用fgetwc读入字符。如果您希望所有字符都在基本的多语言集中(Unicode 字符 U-0000 - U-FFFF),您可以创建一个大小为 65536 的数组并输出它。如果您希望字符超出该范围,您可能需要使用不同的方案。

关于C. 将 char 十进制值存储到数组无法读取/存储 8 位字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35158094/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com