gpt4 book ai didi

c - 对文件内容使用 atoi() 时出现意外结果,按字符读取字符

转载 作者:太空宇宙 更新时间:2023-11-04 00:34:39 25 4
gpt4 key购买 nike

我有一个文本文件,其中只有数字(0、1、2 和 3),我想处理数据以了解每个数字出现了多少次。

以下程序使用小文本文件(<100 个数字)但使用更大的文件(我最终需要处理数千个数据)程序读取不在文本文件中的数字。

这是我的代码:

FILE *file;
char c;
int nb;
int th0 = 0, th1 = 0, th2 = 0, th3 = 0;

file = fopen("../data", "r");

if (file == NULL) {
printf("ERROR FILE: %s", strerror(errno));
return EXIT_FAILURE;
}

while (1) {
if (fscanf(file, "%c", &c) == EOF)
break;

nb = atoi(&c);

printf("%d", nb);

switch (nb) {
case 0:
th0++;
break;

case 1:
th1++;
break;

case 2:
th2++;
break;

case 3:
th3++;
break;

default:
break;
}
}

如果有任何建议,我将不胜感激。

编辑,输入文本输出:

数据文件(181个号码):

001110120101010102012012021201021202102012012012012010210210210120120230103120130230123201320310231023102302301231203213210131032103210230120320310320213202301320123120312302321023

输出: The end of the reading is not what is in the data file and count 156 numbers

最佳答案

你的问题是 atoi 需要一个字符串,而你是这样调用它的:

nb = atoi(&c);

c 只是一个char。有时这可能有效,但您基本上遇到了未定义的行为,因为您无法保证 c 之后的内存为空。

相反,您想以不同的方式计算 nb

nb = c - '0';

这依赖于这样一个事实,即在 ASCII 表中,数字 0 到 9 都在一个 block 中。从 c 中减去“0”的值将得到该字符的数值...假设它是一个数字。

为了确保它是一个数字,您应该将此 if 语句包裹在您的代码中

if(isdigit(c)) // Check if c is a digit
{
nb = c - '0';

switch(nb) {
case 0: th0++;
break;
// rest of switch goes here....
}
}

关于c - 对文件内容使用 atoi() 时出现意外结果,按字符读取字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51103157/

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