2014-01-18 2 views
0
#include<stdio.h> 
#include<string.h> 
int main() 
{ 
    char name[10][30]; 
    int i,n; 
    printf("How many names?\n"); 
    scanf("%d",&n); 
    printf("Enter names\n"); 
    for(i=0;i<n;++i) 
     gets(name[i]); 
    printf("\n The names are\n"); 
    for(i=0;i<n;++i) 
     printf("%s\n",name[i]); 
} 

주문한 사람의 전체 이름을 정렬하려고합니다. 그래서 나는 총 이름 수를 읽고 문자열 배열에 이름을 저장합니다. 그러나 문제는이 프로그램이 실행될 때입니다.get 함수를 사용하여 배열에 문자열 입력

How many names 
4 
Enter names 
john G 
susan sing 
puskar 
The names are 

john G 
susan sing 
puskar 

빈 문자열을 읽은 이유가 없습니다.

답변

3
scanf("%d", &n); 

표준 입력의 정수를 읽는다. 해당 정수 다음에 오는 항목, 특히 을 입력 할 때 입력 한 새 줄 4 뒤에을 입력하면 다음 입력 루틴 (이 경우에는 첫 번째 gets())에서 읽히기를 기다리게됩니다.

빈 줄은 4 이후에 입력했기 때문에 빈 줄이 있습니다.

당신이 물어 본 문제의 직접적인 원인이되었지만 더 큰 문제가 있습니다.

gets 기능을 사용하십시오. 읽고있는 배열보다 더 긴 입력을 방지하지 않으며 안전하게 사용할 수 없습니다. 이것이 2011 년 ISO C 표준에 따라 언어에서 삭제 된 이유입니다.

을 사용하여 입력 행을 읽은 다음 sscanf을 사용하여 메모리의 행에서 정수를 추출 할 수 있습니다. fgetsgets과 달리 배열에 '\n'을 남겨 둡니다. 따라서이를 처리해야합니다 (단, n을 읽을 때 무시할 수 있음). 두 함수에 대한 설명서를 읽고 반환하는 값에주의하십시오. (그들은 자신의 문제가 있지만, 지금은 걱정할 필요가 없습니다.)

0

scanf()fgets()/gets()의 혼합은 문제가됩니다.

gets() 대신 fgets()을 사용하는 것이 좋습니다. gets()dead입니다.

// scanf("%d",&n); 
char buf[50]; 
fgets(buf, sizeof buf, stdin); 
sscanf(buf, "%d", &n);