该程序收到一个字母和字符串,并在引入时接收字符串结束' 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);
}
答案 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
的出现次数。以这种方式初始化primeiro
:primeiro = tolower((unsigned char)letr)
。
stringn
,则应将 letr
初始化为空字符串。使用strcpy(stringn, "");
或*stringn = '\0';
或更高版本执行此操作,请按以下方式定义:char stringn[MAX] = "";