2013-06-07 3 views

ответ

2
char *input; 

Это указатель. Он не указывает на какую-либо память.

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

int main() 
{ 
    //char *input; 
    char input[128]; 
    memset(input, 0 ,sizeof(input)); 
    scanf("%s", input); 
    printf("%s\n", input); 
    return 0; 
} 
+1

+1. Но, пожалуйста, добавьте подсказку о том, что это переполнение буфера. –

6

Объявление char * создает только указатель, оно не выделяет никакой памяти для строки. Вы должны выделить память для ввода. Вы можете сделать это динамически через mallocfree, когда это будет сделано), или вы можете объявить массив статического размера, например char input[100].

+0

Как использовать malloc(), если я не знаю размер моей строки заранее? – BlueFlame

+0

Вам нужно принять максимальный размер. Или, если предположение о максимальном размере невозможно, вы можете читать фрагмент по блоку в цикле, например. прочитайте кусок 1000 символов и добавьте его в буфер, затем прочитайте следующий фрагмент из 1000 символов и продолжайте так, пока не дойдете до конца. – taskinoor

+0

Вот почему 'scanf()' небезопасно, по крайней мере, традиционно. Эта [ссылка] (http://stackoverflow.com/questions/1621394/how-to-prevent-scanf-causing-a-buffer-overflow-in-c) обсуждает некоторые способы преодоления этого. – n3rd4n1

0

заменить char *input; с char input[1024] = {0};

вы должны обеспечить параметр, который вы передаете Scanf указывает на буфер, который может держать ваш вход

Смежные вопросы