抛出总线错误,不明白为什么

时间:2019-02-14 04:19:17

标签: c

尝试运行此代码时出现总线错误。其目的是用数字替换某些字母,用3替换E,用0替换O,以此类推。

#include <stdio.h>
#include <string.h>
#define MAX_BUF 1024

int main () {

char buf[MAX_BUF];
int length;
// other stuff
do {
    // read a line
    fgets(buf, MAX_BUF, stdin);
    // calculate its length
    int len = strlen(buf) - 1;
    // modify the line by switching characters
    char buf2[MAX_BUF];
    strcpy(buf2, buf);
    int i;
    for(i = 0; i < length; i++){
            if (buf2[i] == 'E' || buf2[i] == 'e'){
                    buf2[i] = '3';
            }
            if (buf2[i] == 'I' || buf2[i] == 'i'){
                    buf2[i] = '1';
            }
            if (buf2[i] == 'O' || buf2[i] == 'o'){
                    buf2[i] = '0';
            }
            if (buf2[i] == 'S' || buf2[i] == 's'){
                    buf2[i] = '5';
            }
    }
    // print the modified line
    printf("%s", buf2);
} while (length > 1);
}

来自

输入的预期输出

“敏捷的棕色狐狸跳过了那只懒狗。”是

“ Th3 qu1ck br0wn f0x jump5 0v3r th3 lazy d0g。”

但是,程序再次抛出“总线错误”,我不理解也不知道如何发现。

3 个答案:

答案 0 :(得分:4)

变量length用于限制两个循环的迭代,但从未分配任何值。这是未定义的行为,总线错误肯定是可能的结果。

您是否打算为此目的使用len

编辑:strlen的返回值中已不包含空终止符。 strlen(buf) - 1可能不是您想要的。

答案 1 :(得分:1)

您声明length而不进行初始化。

然后您声明len,并进行初始化。

然后您使用未初始化的length,这将导致未定义的行为。

在编译时调高警告标志(请向您的编译器文档咨询),并且不要在实际需要它们的地方声明变量。

答案 2 :(得分:0)

len的范围应通过'main()'。

因此,删除长度声明,而在此处声明len。 这是更正的代码。

#include <stdio.h>
#include <string.h>
#define MAX_BUF 1024

int main ()
{
        char buf[MAX_BUF];
        int len;

        do {
                fgets(buf, MAX_BUF, stdin);
                len = strlen(buf) - 1;
                printf("%d",len);
                char buf2[MAX_BUF];
                strcpy(buf2, buf);
                int i;
                for(i = 0; i < len; i++){
                        if (buf2[i] == 'E' || buf2[i] == 'e'){
                                buf2[i] = '3';
                        }
                        if (buf2[i] == 'I' || buf2[i] == 'i'){
                                buf2[i] = '1';
                        }
                        if (buf2[i] == 'O' || buf2[i] == 'o'){
                                buf2[i] = '0';
                        }
                        if (buf2[i] == 'S' || buf2[i] == 's'){
                                buf2[i] = '5';
                        }
                }
                printf("%s", buf2);
        } while (len > 1);
}