统计字符串中某个字符出现的次数:我该如何解释这段代码?

3
该任务要求打印出一个输入字符串中所选字符出现的次数(无长度限制)。我想通过仅使用do或do-while循环来解决它,经过一番搜索,我找到了这段代码(来源:https://www.tutorialgateway.org/c-program-to-count-all-occurrence-of-a-character-in-a-string/.)。
我大致明白了它的意思,但还有许多我没有涉及到的东西,比如str[i]的含义、变量ch的含义以及结构的工作方式。我该如何逐个解释它?或者如果有更简单的方法,我该如何处理它?我是一个初学者,我担心这比预期的要容易得多,但我没有继续前进的基础,谢谢。
#include <stdio.h>
#include <string.h>
 
int main() {
    char str[10], ch;
    int i, Count;
    i = Count = 0;
 
    printf("\n Please Enter any String :  ");
    gets(str);
    
    printf("\n Please Enter the Character that you want to Search for :  ");
    scanf("%c", &ch);
    
    while (str[i] != '\0') {
        if (str[i] == ch) {
            Count++;
        }
        i++;
    }
    printf("\n The Total Number of times '%c' has Occurred = %d ", ch, Count);
    
    return 0;
}

3
由于后面你会了解到的原因,这是一个糟糕的示例程序。为了你自己未来的利益,请永远不要使用 gets() 函数。它是一个危险的函数。 - codyne
2个回答

1

我将用一个简单的例子来解释这个问题,并给出适当的解释。希望你能理解。

  • char是一种数据类型,它接受字符类型的变量。在这里,str[100]将是一个长度为100的数组,我们将在其中存储我们的搜索示例。ch是一个字符类型的变量,我们将在其中存储要查找的字符。

  • i和count是整数变量,其中i将是循环变量,而count将保持并发计数。

  • 使用puts函数获取文本字符串后,我们将其存储在str[100]数组中。

  • 然后,我们将搜索字母取出并存储在ch中。

  • 现在,我们从0到给定字符串的长度运行for循环。strlen()函数返回字符串的长度。

  • 现在,str[i]将从i=0到字符串的长度大小进行搜索。每次循环将向前移动一个字母,并将该字母与ch内部的字母进行比较。

  • 如果找到匹配项,则将增加计数值。

循环结束后,计数将是并发的结果。

参考资料:字符串中字母的并发性

#include <stdio.h>
#include <string.h>

int main()
{
    char str[100], ch;
    int i, Count;
    Count = 0;

    printf("\n Please Enter any String :  ");
    gets(str);

    printf("\n Please Enter the Character that you want to Search for :  ");
    scanf("%c", &ch);

    for(i = 0; i <= strlen(str); i++)
    {
        if(str[i] == ch)  
        {
            Count++;
        }
    }
    printf("\n The Total Number of times '%c' has Occured = %d ", ch, Count);

    return 0;
}

3
最好避免使用过时的gets()函数作为答案,即使OP使用它。 - chux - Reinstate Monica
1
不要尝试重新计算字符串长度,而应该直接测试空字符。此外,这个答案的 for (i = 0; i <= strlen(str); i++) 循环比OP更好的 while (str[i] != '\0') { 多迭代1次。 - chux - Reinstate Monica
2
不建议使用i <= strlen(str)'\0'不应被视为字符串的一部分。经典的终止测试是str[i] != '\0'。此外,不应该在任何编码问题中使用gets() - chqrlie
谢谢,这澄清了一些事情。 - cadou
这是一种非常捷径的解决方法。但是为了解决问题,不建议使用gets()或strlen(),正如@chux - Reinstate Monica和chqrlie所说。您可以创建自己的自定义代码来查找长度而无需strlrn()并存储字符串而无需gets()。我给您提供两个参考文献,您可以从中获取相关想法。 - Sabbir Alam Pran
现在来接受一个挑战,用这些参考资料中讨论的方法替换它们。链接链接 - Sabbir Alam Pran

0
代码包含以下部分:
1)头文件:这些文件包含预定义的函数,如scanf(),您可以在程序中使用它们。
2)主函数:在这里,您正在执行字符计数。通常,此函数包含程序的驱动程序代码。 ch是要在字符串中计数的字符变量。您将使用scanf()从用户输入此变量。 str是您要执行计数操作的字符串。它也被视为输入。 str[i]用于表示字符串中的索引i。例如,在“test”中,“s”的索引将为2,因为它是第三个字符,而您的索引从0开始。
最后说明:如果您不知道索引,请先了解数组的基本语法和用法。另外,正如某人评论的那样,请勿使用gets()。它会导致程序存在安全问题,因为用户可以通过提供包含格式说明符的恶意输入来访问堆栈值。 相反,当访问来自文件的内容时,请使用带有适当格式说明符的scanf或使用fgets()

谢谢,你澄清了变量方面的问题。我也认为gets()是一个特殊命令而不是scanf的糟糕版本,谢谢你解释这一点,这并不明显。 - cadou

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接