2016-01-26 6 views
0

Что делает функция get здесь, здесь хранится первая входная строка здесь в pt [1] вместо pt [0] и выходит из цикла после чтения строк p-1, если используется scanf, он считывает строки p, но печатает 1-я строка (pt [0]) как пустое пространство?необычное поведение строк

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 
int main(void) 
{ 
    int c,i,j,p,k; 
    char d[100],pt[1000][1000]; 
    scanf("%d",&c); 
    for(i=0;i<=c-1;i++) 
    { 
    scanf(" %c",&d[i]); 
    } 

    scanf("%d",&p); 

    for(i=0;i<=p-1;i++) 
    { 
    scanf(" %c",&d[i]); 
    } 

    scanf("%d",&p); 

    for(i=0;i<=p-1;i++) 
    { 
    gets(pt[i]); 
    } 
     /*the first string is stored in pt[1] instead of pt[0] and loop terminates after reading p-1 strings */ 
+0

Не используйте 'gets', он устарел, потому что он небезопасен со стандарта C99 и полностью удаляется из стандарта C11. –

+0

Избегайте объявления больших объемов данных локально, в стеке. Этот код имеет большой потенциал для переполнения стека. – Lundin

ответ

2

В предыдущем scanf вызов оставляет символ новой строки во входном буфере, что означает первый gets вызов читает, что символ новой строки как пустая строка.

Самый простой способ решить это - один звонок fgets, чтобы получить «отдых» линии между вызовом scanf и циклом.

+0

Я думал, что это было только для случая c, а некоторые переменные spl, такие как d и f, автоматически устраняют пробелы, поэтому это не должно быть здесь, так как очевидно, что предыдущий ввод здесь был целым числом. –

+0

@SumitKumar Большинство форматов читает и отбрасывает * ведущее * белое пространство, без форматирования и отбрасывания. –

+0

да .. это действительно проблема .. и помещение пространства впереди% s в scanf тоже решает. .. –

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