c - DEVC++ 中的错误(比较字符串和字符)

标签 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++。这是一个错误吗?

最佳答案

获得不同结果的原因:

早些时候,当您没有初始化变量 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. 还会询问您是否是全局变量。如果是这样,那么您可能不必担心初始化。它们将用 0 初始化。

  2. gets() 继续读取字符,直到遇到 \nEOF。并且在执行此操作时,缓冲区大小不受任何限制,从而存在缓冲区溢出的可能性。

关于c - DEVC++ 中的错误(比较字符串和字符),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47286964/

相关文章:

c - Arduino 和 ESP8266 HTTP GET 响应处理

c - 为 Automake 文件中的一个程序设置预处理器指令

c - if 语句在表达式中具有等号 "="而不是 "=="

c - 指针初始化。它是如何工作的?

c++ - 为指针赋值

c++ - 检查注册表项是否存在

c - 释放可变参数函数中的所有参数

windows - Dev-C++为错误版本的Windows创建EXE?

c++ - 来自 dev cpp 文件的标准输入

c - Dev C++ 数组问题