gpt4 book ai didi

计算字符串中的字符数

转载 作者:行者123 更新时间:2023-11-30 15:14:05 24 4
gpt4 key购买 nike

我正在尝试计算一个字符在字符串中重复的次数(可以是多个单词),但是,现在我认为我非常接近结果,但我的输出有点奇怪:

代码:

int statistics(){
char str[122];
int i=0;
int count[122] = { 0 };
printf("Enter a string: ");
fgets(str,sizeof str, stdin);
if(fgets(str,sizeof str, stdin) == NULL){
printf("error");
}
size_t size = strlen(str);

for(int i = 0; i < size; i++) {
count[(int)str[i]] += 1;
}

for (i = 0; i < 122; i++) {
if(count[i]>=1){
printf("The %d. character has %d occurrences.\n", i, count[i]);
}
}
strtok(str,"\n");
printf("'%s' is %lu characters long\n",str,size-1);
}

例如输入:你好

输出:

The 107. character has 1 occurences.
The 198. character has 1 occurences.
The 201. character has 1 occurences.
The 205. character has 1 occurences.
The 208. character has 1 occurences.
'Hello' is 5 characters long

最佳答案

您正在使用 count 中索引的当前编码。如果你的编码是ASCII (最常见的编码),那么字符 'H' 的值为 72,因此您将增加 count[72] 并且当您打印时您将在输出中将其打印为第 72 个字符。

而是使用循环变量作为计数器,然后使用 str[i] 中的字符作为计数器数组的索引。

类似这样的事情

for (size_t i = 0; i < strlen(str); ++i)
{
if (isprint(str[i])
{
printf("Character #%zu is '%c' and the count is %d\n",
i + 1, str[i], count[str[i]]);
}
else
{
printf("Character #%zu is 0x%02hhx and the count is %d\n",
i + 1, str[i], count[str[i]]);
}
}

顺便说一句,请小心 fgets 的输入,它很可能会在字符串末尾留下换行符,你也会计算它。我在上面的代码中使用 isprint 进行处理查看该字符是否“可打印”。

此外,更重要的是,当您使用字符编码作为 count 数组中的索引时,您需要的元素数量与编码中的字符数量一样多。与ASCII encoding (最常见且可能是您正在使用的)您需要 128 个元素来计算 ASCII table 中所有可能的字符(不包括“扩展 ASCII”)。因此,您需要声明包含 128 个元素的 count 数组。如果不这样做,那么您就有可能对 count 数组进行索引越界,并产生未定义的行为

关于计算字符串中的字符数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34185771/

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