Взгляд в C / Reading - PullRequest
       37

Взгляд в C / Reading

0 голосов
/ 20 сентября 2011

Я написал этот код, как своего рода заглядывание.

int main() {
    char a[100];
    char b[100];
    scanf("%s", a);
    if (a[0] == '@') {
        scanf("{%s}", b);
    }
    printf("%s\n", b);
}

По какой-то причине после первого нажатия ввода segfault появляется ошибка ввода, равная @hi. Что происходит?

Ответы [ 2 ]

2 голосов
/ 20 сентября 2011

Проблема в вашем первом фрагменте кода (до редактирования) заключалась в том, что вы создавали строку, содержащую 2 символа.«0» и NULL.Затем вы пытаетесь перезаписать это с помощью 4 символов из scanf.

Во втором фрагменте кода вы не указываете указатель на символ в любом месте .Вы только что объявили это, не задавая значение, чтобы оно могло указывать на что-либо.

Чтобы получить желаемое поведение, вам нужно создать массив символов:

char a[100];
char b[100];

ВыВам нужно будет сделать массив достаточно большим для ваших целей.

Кроме того, если вы хотите прочитать две строки в них, вам придется "использовать" пробел между ними.Для этого измените второй scanf на:

scanf(" {%s}", b);

Запишите пробел перед {.

0 голосов
/ 20 сентября 2011

scanf("%s", a); для справочной страницы пытается сохранить строку (%s) в местах, на которые указывают аргументы указателя, следующие за форматом (a).В этом случае a неинициализируется и не указывает на какое-либо место для хранения.Чтобы прочитать один символ, рассмотрите этот пример:

int main(int argc, char **argv)
{
    char c;


    /* among other things, read a character */
    scanf("%c", &c);

    return 0;
}

разверните его, чтобы получить намеченное поведение.Кроме того, я бы посоветовал вам держаться подальше от scanf и сопоставлять себя при чтении с fgets.

...