2016-10-24 5 views
1
#include<stdio.h> 
#include<malloc.h> 

int main() 
{ 
    char *string1; 
    int length; 

    scanf("%d", &length); 

    string1 = (char *)malloc(sizeof(char) * length); 


    printf("\n Enter the First String : "); 
    fgets(string1, length, stdin); 

    printf("\n The First String : %s ",string1); 

    free(string1);  

    return 0; 
} 

Может ли кто-нибудь помочь мне по вышеуказанному коду? Я пытаюсь получить длину строки и строки в качестве входных данных. Но я могу ввести только длину строки. После этого он пропускает часть ввода строки.C - Распределение динамической памяти

Это выход я получаю:

sh-4.3$ main 
10 

Enter the First String : 
The First String : 
sh-4.3$ 
+3

Вы написали '10 '? 'fgets' будет читать это' '. – mch

+0

Да, это то, что происходит. Используйте 'scanf' вместо' fgets'. – AhmadWabbi

+0

Добавьте 'getchar();' после scanf, чтобы отбросить новый символ строки, который вы оставили в stdin. – Lundin

ответ

1
  • После ввода "10<enter>" в <enter> или "\n" останется в буфере стандартного ввода, так что вы должны использовать getchar() после scanf для удалить его.

  • Также вы должны #include <stdlib.h> вместо malloc.h.

  • Вы malloc 1 символ слишком меньше, из-за 0-терминатора. string1 = malloc(length + 1); будет делать работу, бросок не необходимости и sizeof(char) всегда 1.

+0

Добавлен getchar() после scanf(). Это сработало. Спасибо всем, что нашли время, чтобы помочь. –

0

Если вам нужно использовать stdin для ввода строки, вы можете использовать fgetln. Я редактировал вам пример, и теперь он выглядит так:

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

int main() 
{ 
    char *string1; 
    size_t length; 

    //scanf("%d", &length); 

    //string1 = (char *)malloc(sizeof(char) * length); 


    printf("\n Enter the First String : "); 
    //fgets(string1, length, stdin); 
    string1 = fgetln(stdin, &length); 
    string1[length] = '\0'; 

    printf("\n The First String : %s ",string1); 

    free(string1); 

    return 0; 
} 

Примечание: fgetln возвращает не C строку, вы должны добавить символ NULL до конца.

+3

'fgetln' не является стандартным. Вместо этого используйте 'fgets'. – Lundin

+0

Автор вопроса ничего не написал о компиляторе. Я использовал Apple LLVM. –

+2

Поскольку он помечен C без упоминания о том, какая система используется, вы должны попытаться ответить стандартным C. В частности, нет причин использовать нестандартные функции, имеющие стандартные эквиваленты. – Lundin

0

Самый простой ответ при чтении из STDIN/клавиатуры с новой строки и т.д. будет просто добавить «\ п "к зсапу, то есть:

scanf("%d\n", &length); 

решает проблему;)

PS: Берегитесь все другие проблемы переполнения безопасности/буфера зсапЕ

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