2015-06-05 6 views
0

вот код обижая с помощью Ubuntufgets Сегментация ошибки при чтении ввода от пользователя

char *name; 

int main(void) 
{ 
    fgets(name, sizeof(name), stdin); 
} 
void HUD() 
{ 
    printf("%s ", name); 
} 

Вот моя проблема. Я начал с scanf («% s», &) и получал мусор в конце строки. За последние 2 часа были прочитаны документы на scanf и fgets, потому что, очевидно, scanf не следует использовать, когда вы не знаете размер требуемого массива (и поскольку пользовательский ввод может отличаться по размеру), я решил попробуйте использовать fgets. Я также попытался установить фиксированное значение как по имени символа [100]; и fgets (name, 100, stdin)

Теперь я получаю ошибку сегментации, и, прочитав каждый результат, который я нашел на первых двух страницах google, мой синтаксис выглядит корректным, и я ничего не нашел на cboard или здесь, чтобы исправить мою проблему.

Любые идеи?

+0

Я уже сделал это. Нет успеха. Все еще возникает ошибка сегментации. – nanthil

+0

Вы можете использовать 'scanf()' просто отлично, когда вы не знаете длину ввода, если вы указываете ширину поля, которая предотвращает переполнение массива. 'fgets()' имеет точно такое же ограничение; это просто более подробно о том, как заставить вас рассказать о том, сколько символов он должен читать. –

+0

Обратите внимание, однако, что 'scanf()' и 'fgets()' отличаются от того, как определить, когда прекращать чтение. –

ответ

3

sizeof(name) Будет размер указателя на вашей системе, по моему это 8 байт. Не размер буфера, как вы, возможно, ожидали

Также char* name неинициализирован. Вы попытаетесь записать в неинициализированный буфер, и это закончится неопределенным поведением.

Чтобы решить, сделайте ли это буфер фиксированного размера или выделите некоторое пространство в куче.

Выделяют

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

#define NAME_SIZE 100 
char *name; 

void HUD() 
{ 
    printf("%s ", name); 
} 

int main(void) 
{ 
    name=calloc(NAME_SIZE, sizeof(char)); 
    fgets(name, NAME_SIZE, stdin); 

    HUD(); 

    free(name); 
} 

статический массив

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

#define NAME_SIZE 100 
char name[NAME_SIZE]; 

void HUD() 
{ 
    printf("%s ", name); 
} 

int main(void) 
{ 
    fgets(name, NAME_SIZE, stdin); 

    HUD(); 
} 

Вы должны пройти размер буфера fgets так знать, сколько места он должен написать, чтобы.

+0

Не существует способа прочитать строку до тех пор, пока они не ударят \ n и не зададут размер массива для введенных символов + \ 0? – nanthil

+0

Все становится сложным, потому что буферы автоматически не изменяются в fgets, вам придется катить свое собственное решение. fgets будет читать до тех пор, пока array_size не будет прочитано 1 символ или не будет получен новый символ линии. –

+0

@nathanil в c вы не получаете много бесплатно. Вам придется реализовать свое собственное решение, которое будет перераспределять более крупный буфер по мере роста ввода. Если вы посмотрите на std :: string в C++, это что-то происходит по этим строкам. –

-2

char *fgets(char *restrict s, int n, FILE *restrict stream);

The fgets() функция должна прочитать байты из потока в массив , на который указывает с, до N-1 байт не считываются, или считывается и передается с, или встречается конечное состояние файла. Строка затем заканчивается нулевым байтом. [0]

Необходимо присвоить его определенному размеру и вызвать fgets с этим размером. Этот код может помочь вам выполнить одно и то же, но у него есть буфер фиксированного размера.

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

char name; 
char* buffer; 
int buffer_size = 16; 
int i = 0; 


void HUD() 
{ 
     printf("%s ", buffer); 
} 

int main(void) 
{ 
     buffer = malloc(buffer_size); 
     if(!buffer) return; 

     for(;;) { 
       name = getchar(); 
       if(name < 0) { 
         buffer[i] = '\0'; 
         goto finish; 
       } else if(i < (buffer_size -1)) { 
         buffer[i++] = name; 
       } else if(name == '\n') { 
         break; 
       } 
     } 
     buffer[i] = '\0'; 
     finish: 
      HUD(); 
      free(buffer); 
      return 0; 
} 

[0] http://pubs.opengroup.org/onlinepubs/009695399/functions/fgets.html

+0

Что делает инициализация переменной? Я прихожу из C#, и у меня создалось впечатление, что если не задан конкретный размер, он будет читать то, что я ему даю, и добавить нулевой символ в конец, потому что это char * ...это действительно не объяснялось мне очень хорошо, когда они объясняли ввод ввода – nanthil

+0

'goto finish;' Убей его огнем! – this

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