使用C中的字符串计算字母出现次数

时间:2016-01-02 22:52:59

标签: c string words

该程序收到一个字母和字符串,并在引入时接收字符串结束' FIM'在字符串中。它使字符串重复接收字母的次数,并将其全部打印出来。 它给了我一个错误,我不知道如何解决它(见内联评论):

#include <stdio.h>
#include <ctype.h>

#define MAX 101

int conta(char frase[], char letr) {
    int n = 1, i;
    int nmax = 0;
    char primeiro = tolower(frase[0]), stringn[MAX];

    do {
        printf("introduce string: ");
        gets(frase);
        for (i = 1; frase[i] != '\0'; i++) {
            if (tolower(frase[i]) == primeiro)
                n++;
        }
        if (nmax < n) {
            nmax = n;
            stringn[] == frase[];   /*Error!!*/
        }
    } while (frase != 'FIM');

    printf("The string where %c surgiu %d appeared more time is: %c ",
           letr, nmax, stringn);
}

void main() {
    char frase[MAX];
    char letr;

    printf("give a letter:");
    scanf("%c", &letr);
    conta(frase, letr);
}

1 个答案:

答案 0 :(得分:4)

stringn[] == frase[]是无效的C代码,要复制字符串,请使用strcpy(stringn, frase)

请注意,您的代码还有许多其他问题:

  • frase != 'FIM'也不正确,但编译器诊断很难理解,因为您使用的是过时的C语法。要比较字符串,您应该使用strcmp。在这种情况下,strcmp(frase, "FIM") != 0。此外,您不应使用do / while循环,因为在检查FIM的出现之前,您必须检查字符串是否与letr匹配。

  • gets已过时而且有风险。请改用fgets。请注意,fgets读取的字符串如果输入的话,最后会包含'\n'

  • 您不应将裸char传递给tolower:如果char类型已签名,则会为负字符值调用未定义的行为,例如非ASCII字符。请使用以下语法:tolower((unsigned char)frase[0])

  • 您实际上计算每行的第一个字母的出现次数,而不是letr的出现次数。以这种方式初始化primeiroprimeiro = tolower((unsigned char)letr)

  • 如果没有任何行出现stringn,则应将
  • letr初始化为空字符串。使用strcpy(stringn, "");*stringn = '\0';或更高版本执行此操作,请按以下方式定义:char stringn[MAX] = "";