Использование scanf, чтобы получить строку для создания и проверки ее по циклу while ... продолжаю получать - PullRequest
0 голосов
/ 09 декабря 2011

Я создаю символ *, который по существу будет рассматриваться как строка. Предполагается, что строка будет использоваться снова и снова. Каждый раз, когда я пытаюсь проверить с помощью цикла while и посмотреть, правильно ли он равен "quit" ...

* Я продолжаю получать ошибку сегментации ... Что я делаю неправильно - Довольно идиотская ошибка - возможно?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char* argv[])
{

    char* input = (char*)malloc(sizeof(char));
    input = "CONTINUE";

    while(strcmp(input, "quit") != 0)
    {
            printf("%s", "System: ");
            scanf("%s", input);
    }
    return 0;
}

Ответы [ 2 ]

1 голос
/ 09 декабря 2011

Вы пытаетесь изменить литерал, который является незаконным. Попробуйте:

char* input = (char*)malloc(sizeof(char)); /* You need more than one char. */
char* input = (char*)malloc(LENGTH); /* Allocate `LENGTH` chars. */

input = "CONTINUE"; /* You can't write (scanf) over a string literal. */
strcpy(input, "CONTINUE"); /* Now it's legal to write over `input`. */

Другие моменты, на которые следует обратить внимание:

  • Использование scanf с чистым "% s" небезопасно. Вы должны использовать что-то вроде "%10s", чтобы потенциальный злоумышленник не вводил более 10 символов

  • Знаете ли вы, что sizeof(char) не требуется, поскольку гарантированно будет 1 ?

1 голос
/ 09 декабря 2011

Две проблемы, которые я вижу на первый взгляд:

char* input = (char*)malloc(sizeof(char)); 
  1. Вы назначаете указателю память только одного символа. У него должно быть достаточно памяти, чтобы вместить вашу строку, а не один символ.

  2. Вы должны скопировать строку в выделенный буфер, используя strcpy. Не присваивать строковый литерал указателю. Обратите внимание, что изменение такого строкового литерала приводит к неопределенному поведению .

    input = "CONTINUE";

Правильный способ сделать вышеупомянутые 2:

char* input = (char*)malloc(sizeof(MAX_LENGTH)); 
strcpy(input, "YOURSTRING"); 

Где MAX_LENGTH достаточно для хранения ваших входных строк.

...