2014-10-09 3 views
0

공백으로 구분 된 1-3 자리 숫자를 포함하는 사용자 입력을 scanf()를 사용하여 int 배열에 저장하고 인쇄하려고합니다. 테스트 할 새 줄마다 각각 하나씩 있지만 작동하지 않습니다. 여기에 지금까지 무엇을 가지고 :scanf를 사용하여 공백으로 구분 된 숫자를 읽고 배열에 저장 - C

그래서 사용자는 일련의 숫자과 같이 입력하도록 요청
#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    int sourceArr[500]; 
    int i = 0; 

    printf("\nEnter ciphertext: \n"); 
    while (scanf("%d", &sourceArr[i++]) == 1); 
    for (int j=0;j<500;j++) { 
    printf("%d\n", sourceArr[j]); 
    } 
} 

:

Enter ciphertext: 
23 122 32 

난에 sourceArr 23 [0] (122)을 저장할

23 
122 
32 

를 있지만 프로그램 바로 입력을 입력 한 후 유휴 및 번호를 인쇄 할 것이다 sourceArr [1] sourceArr 32 [2] 다음과 같이 각각의 하나를 출력한다.

+1

질문을 편집하고 제공하는 입력 샘플, 얻은 결과 및 출력 예상 샘플을 제공하십시오. 감사. –

+0

'for' 루프를'for (int j = 0; j

답변

1

성공한 경우 scanf은 성공적으로 채워진 인수 목록의 항목 수를 반환합니다. 이 수는 일치하는 실패, 읽기 오류 또는 파일 끝 도달으로 인해 예상되는 항목 수와 일치하거나 작을 수 있습니다 (심지어 0). 당신이 원하는대로

그것은 표시됩니다 1 2 3 4 5 6 ×를 (그리고 Enter 키를 누르십시오) : 사용자가 입력 한 경우

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

int main() 
{ 
    int sourceArr[500]; 
    int i = 0; 

    printf("\nEnter ciphertext: \n"); 
    while (scanf("%d", &sourceArr[i++]) == 1); 
    for (int j=0;j<i-1;j++) { 
    printf("%d\n", sourceArr[j]); 
    } 
} 

:

당신은 그것으로 변경 될 수 있습니다.

당신은 'x'를 사용할 수있는 동안이 라인이 마음에 들지 않는다면 :

while (scanf("%d", &sourceArr[i++]) != EOF); 

을 다음과 같이 입력 한 후 (Ctrl + Z)을 (Enter 키를 누르십시오) 12 23 345 554 및 유닉스에서는 (ctrl + d).

이 스레드를 참조하십시오 End of File(EOF) of Standard input stream (stdin)

Ctrl 키를 + 콘솔이 더 EOF이 없으며이 방법으로 전송 될 필요가 있기 때문에 Z는 명시 적으로 scanf와 반환 EOF한다.

+0

좋아요.이 숫자는 한자리 숫자로 작동하지만 사용자가 입력 할 숫자는 1-3 자리 숫자 일 수 있습니다. 예 : 1, 23, 213 * 0 - 255 * 사이에서 정확하게 작동하도록하려면 어떻게해야합니까? – user3373360

+0

@VAndrei :이 문제를 해결할 수있는 유일한 방법입니까? 입력 끝 부분에 x를 입력하면 정말 잘 보이지 않는 것입니까? – Gopi

+0

실제로 모든 숫자에 대해 작동하지 않습니다. 한자리 수만이 아닙니다. @pala 이것은 유일한 해결책이 아닙니다. 이것은 최소한의 "침입"입니다 :) – VAndrei

1

"%d"' ''\n'과 같이 앞에 오는 공백을 사용합니다 (' '이 아님).

그래서 사용자가 "123 456 789"을 입력하면을 입력하면 더 많은 입력을 기다리는 중 scanf()이 다시 호출됩니다. 입력 된 숫자가 아닌 데이터 인 stdin이 닫히거나 거의 IO 오류가 발생하지 않을 때까지 계속 대기합니다. stdin 이후

는 일반적으로 을 누르면를 입력 할 때까지 stdinscanf()이 라인에서 모든 입력 이 표시되지 않는, 버퍼링된다.

while (scanf("%d", &sourceArr[i++]) == 1); 

코드,를 입력 로 입력을 종단 A 라인을 읽을 fgets()를 사용할 필요가있는 경우. 그런 다음 sscanf() 또는 strtol()을 사용하여 구문 분석하십시오.아래는 "%n"을 사용하여 char의 수를 기록한 것입니다.

char buf[100]; 
printf("\nEnter ciphertext: \n"); 
if (fgets(buf, sizeof buf, stdin) == NULL) 
    Handle_EOF(); 

char *p = buf; 
int n; 
while (sscanf(p, "%d%n", &sourceArr[i], &n) == 1) { 
    i++; 
    p += n; 
} 

for (int j = 0; j < i; j++) { 
    printf("%d\n", sourceArr[j]); 
} 
관련 문제