2014-11-03 3 views
-1

Я пытаюсь прочитать строку из stdin с помощью fgets(), я хочу использовать функцию fgets() в моей функции, которая, по моему мнению, является проблемой. Строка может быть не более 1024 символов. Когда я запускаю этот код я получаю «ошибка сегментации (ядро сбрасывали)»C - читать строку из stdin с функцией fgets() в функции

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

#define MAX_SIZE 1025 

void print_fgets(); 

int main() 
{ 
    print_select(); 
    return 0; 
} 

void print_select() 
{ 
    char *str; 
    int length; 

    while (fgets(str, MAX_SIZE, stdin)!=NULL) 
    { 
     length=strlen(str); 

     if (length==MAX_SIZE-1 && str[length-1]!='\n') 
     { 
      printf("Error, line overeached buffer!\n"); 
      return 1; 
     } 

     if (str[length-1]=='\n') 
      str[length-1]='\0'; 
     printf("%s\n", str); 
    } 
} 
+0

где вы? – HuStmpHrrr

+5

вы не выделили память для 'str'. вот почему. – HuStmpHrrr

+0

Как выделить память? Я новичок в C. – Krop

ответ

0

Проблема заключается в том, что вы пытаетесь записать на место, что str указатель указывает на. Первоначально он укажет на некоторый адрес мусора (из-за char *str не инициализируется).

Вы можете попробовать стек на основе решения, а не за счет изменения:

/* This is just a pointer */ 
char *str; 

к:

/* This is a character array (on the stack) of size MAX_SIZE, initialized to zero */ 
char str[MAX_SIZE] = {0}; 

Или, если вы хотите выделить память динамически для массива, сделать это вместо:

char *str; 
str = calloc(1, MAX_SIZE); 
if (str == NULL) { 
    /* Failed to allocate memory */ 
} 

... Your code 

free(str); /* You should always free dynamically allocated memory when you are done with it */ 
str = NULL; /* It's a good practice to point your pointer to NULL after it's free'd */ 

Не забывайте такие вещи, как индекс массива, начиная с 0 и переходит в MAX_SIZE - 1 (в вашем случае) и завершение NUL (строки должны быть завершены).

+1

Инициализация в этом случае не нужна. 'fgets' также * гарантирует * NULL завершение. – sfstewman

+0

@sfstewman Конечно, но я считаю, что для начинающих всегда нужно начинать инициализацию до нуля, чтобы избежать проблем. В следующую минуту это не называется 'fgets', а что-то другое, что не гарантирует, например, завершение отказа. – Jite

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

#define MAX_SIZE 1025 

int print_select(); /* Use correct name (instead of print_fgets()) */ 

int main() 
{ 
    print_select(); 
    return 0; 
} 

int print_select() /* Fix. Dhould return int if you have a return <int> statement. */ 
{ 
    char str[MAX_SIZE]; /* Initialize static memory. */ 
    int length; 

    while (fgets(str, MAX_SIZE, stdin)!=NULL) 
    { 
     length=strlen(str); 
     if (length==MAX_SIZE-1 && str[length-1]!='\n') 
     { 
      printf("Error, line overeached buffer!\n"); 
      return 1; 
     } 
     if (str[length-1]=='\n') 
     { 
      str[length-1]='\0'; 
     } 
     printf("%s\n", str); 
    } 
    return 0; /* Function may not be returning an int. Return it in those cases. */ 
} 
+1

Не нужно снова вставлять весь код. Используйте доступный макрос 'MAX_SIZE' вместо жестко закодированного' 1025'. – Jite

+0

Да, извините. Я новичок. –

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