我正在尝试创建一个程序来计算我的字符串中出现多少个字母。我只想计算给定字符串上的字母A和B.
char string[10];
int countA, countB;
gets(string);
for(int i = 0; i <strlen(string); i++){
if(string[i] == 'A')
countA++;
else if(string[i] == 'B')
countB++;
}
printf("%d %d", countA, countB);
return 0;
例如我的输入是:ABABA 输出应为3 2但是它为countB打印不同的答案。我正在使用devc ++。这是一个错误吗?
答案 0 :(得分:1)
早些时候,当您没有初始化变量countA
和countB
时,它们包含不确定的值。在代码中使用它们会引入未定义的行为。
两点:
将变量初始化为零。 countA
和countB
。
并且不要使用gets
而是使用fgets
。
我给你举个例子:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int main(){
char string[10];
unsigned int countA=0, countB=0;
if( fgets(string,10,stdin) == NULL){
fprintf(stderr, "%s\n", "Error in string input");
exit(1);
}
size_t len = strlen(string);
if( len > 0 )
string[len-1]='\0';
for(size_t i = 0; i <strlen(string); i++){
if(string[i] == 'A'){
countA++;
}
else if(string[i] == 'B'){
countB++;
}
}
printf("%u %u", countA, countB);
return EXIT_SUCCESS;
}
注意:
还有人问你是否是gloabal变量。如果那时你可能不必担心初始化。它们将使用0
进行初始化。
gets()
继续阅读字符,直到遇到\n
或EOF
。并且在执行此操作时,它不会受到缓冲区大小的限制,从而有可能导致缓冲区溢出。