Ошибка автобуса и не понимаю, почему - PullRequest
0 голосов
/ 14 февраля 2019

Я получаю ошибку шины при попытке запустить этот код.Цель этого состоит в том, чтобы заменить определенные буквы цифрами, E на 3, O на 0 и т. Д.

#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);
}

Ожидаемый результат ввода

"Быстрая коричневая лиса перепрыгивает черезленивая собака. "is

"Th3 qu1ck br0wn f0x jump5 0v3r th3 lazy d0g."

Но опять же, программа выдает «Ошибка шины», которую я не понимаю и не знаю, как ее найти.

Ответы [ 3 ]

0 голосов
/ 14 февраля 2019

Вы объявляете length без инициализации.

Затем вы объявляете len с инициализацией.

Затем вы используете неинициализированный length, которыйведет к неопределенному поведению.

При компиляции поднимайте флаги предупреждений (обратитесь к документации по компилятору) и не объявляйте переменные настолько далеко, насколько это действительно необходимо.

0 голосов
/ 14 февраля 2019

Область действия 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);
}
0 голосов
/ 14 февраля 2019

Переменная length используется для ограничения итераций обоих ваших циклов, но ей никогда не присваивается значение.Это неопределенное поведение, и возможной причиной этого является ошибка шины.

Вы намеревались использовать len для этой цели?

РЕДАКТИРОВАТЬ: strlen уже не включает нулевой терминатор в свое возвращаемое значение.strlen(buf) - 1, вероятно, не то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...