BUC IN DEVC ++(比较字符串和字符)

时间:2017-11-14 13:23:07

标签: c dev-c++

我正在尝试创建一个程序来计算我的字符串中出现多少个字母。我只想计算给定字符串上的字母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 ++。这是一个错误吗?

1 个答案:

答案 0 :(得分:1)

获得不同结果的原因:

早些时候,当您没有初始化变量countAcountB时,它们包含不确定的值。在代码中使用它们会引入未定义的行为。

两点:

  • 将变量初始化为零。 countAcountB

  • 并且不要使用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;
}

注意:

  1. 还有人问你是否是gloabal变量。如果那时你可能不必担心初始化。它们将使用0进行初始化。

  2. gets()继续阅读字符,直到遇到\nEOF。并且在执行此操作时,它不会受到缓冲区大小的限制,从而有可能导致缓冲区溢出。