尝试运行此代码时出现总线错误。其目的是用数字替换某些字母,用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。”
但是,程序再次抛出“总线错误”,我不理解也不知道如何发现。
答案 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);
}