2017-02-07 4 views
-3

실행 중에 사용자의 n 정수를 읽고 싶습니다. 숫자는 공백으로 구분됩니다. 배열로 수신하는 것이 가장 좋습니다. 입력 1 22 3 445 3의 경우 결과는 array[0]=1, array[1]=22이됩니다. 나는 삽입 얼마나 많은 같은 번호를 모르는 때문에C에서 공백으로 구분 된 n 개의 숫자를 읽는 방법

scanf("%d %d %d", &var1, &var2, &var3); 

를 사용할 수 없습니다 C.에 그것을 할 수 있습니다. n 값은이 데이터를 읽기 전에 사용자로부터 읽습니다.

+5

루프에 대해 들었습니까? –

+1

같은 줄에 공백으로 구분 된 숫자를 읽는 데 루프를 사용할 수 있다고 생각하지 않습니다. 루프를 실행하려면 각 값에 대해 다른 명령문이 필요합니다. 내가 틀렸다면 수정하십시오. –

+0

루프에서'fgets'와'strtol'을 사용할 수있는 요소의 수를 모르는 경우에는'int arr [MAX_ELEMS];'와 같은 고정 길이 배열을 사용하여 그 값을 저장하거나'realloc'을 사용할 수 있습니다. 또는 연결된 목록 ... 여러 가지가 있습니다. –

답변

1

fgets()을 사용하고 strtok()atoi()으로 사용하십시오.

숫자를 문자열로 사용하십시오.

여기 한 가지 방법이 있습니다.

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
int main() 
{ 
    char numbers[100]; 
    int myn[100]; 
    printf("Give me numbers..\n"); 
    fgets(numbers,100,stdin); 
    const char s[2] = " "; 
    char *token; 

    token = strtok(numbers, s); 
    int i=0;  
    myn[i]=atoi(token); 

    while(token != NULL) 
    { 
    i++; 
    printf(" %s\n", token); 
    token = strtok(NULL, s); 
    myn[i]=atoi(token); 
    } 
    printf("You gave me: "); 
    for (int j=0; j<i; j++){ 
    printf ("%d, ", myn[j]); 
    } 
    return(0); 
} 

위의 C 프로그램은 원하는대로 정확하게 수행합니다. for 루프에서 키보드로 입력 한 숫자를 화면에 출력합니다. "문제"는 을 사용하면 훨씬 더 쉽습니다. 숫자 사이에 공백 대신 대신을 입력하십시오. 링크에

givenumbers.c


클릭

는, 사용 기능에 대한 매우 유용한 정보를 볼 수 있습니다. 같이

+0

하지만 우리는'atoi' 나'strtol' 같은 것을 사용하여 그 문자열을'int'로 변환해야합니다, 그렇죠? –

+0

예; 문자열을 개별 값으로 분리하기 위해'strtok'을 사용한 후에는 개별적인 값 문자열을'int'로 변환하는 함수를 사용할 것입니다. – Matthew

+1

'strtok() '을 사용할 필요가 없습니다. 'strtol()'을 사용하면 더 좋을 것입니다. 변환 된 숫자의 끝이 어디인지 알려줍니다. 그것은 또한 범위 검사 등을합니다. –

2
enum { MAX_NUMBERS = 1000000 }; // Choose appropriate upper bound 
int n; 
if (scanf("%d", &n) == 1 && n > 0 && n < MAX_NUMBERS) 
{ 
    int array[n]; 
    for (int i = 0; i < n; i++) 
    { 
     if (scanf("%d", &array[i]) != 1) 
      …process error — terminate loop?… 
    } 
    …use array… 
} 

당신은 루프를 사용하여 scanf() 여러 숫자를 읽을 수 있습니다. 그들이 모두 한 줄에 표시되었거나 각각의 줄에 있는지, 또는 연속적인 숫자 사이에 빈 줄이 있는지 (또는 이러한 모든 가능성이 어떤 순열인지) 알 수 없습니다.

scanf() 패밀리는 기본적으로 개행을 신경 쓰지 않습니다. 그렇게하도록 강요하는 것은 어렵습니다. 줄 기반 입력에 신경 쓰면 또는 POSIX 함수 getline()을 사용하여 줄을 읽고 sscanf() - 또는 다른 문자열 구문 분석 함수 - 줄을 처리합니다.

VLA (가변 길이 배열)로 C99를 지원한다고 가정합니다. 그 원칙이 그지지가 없다면 똑같습니다. 역학은 조금 다릅니다 (그리고 그것을 수행하는 방법에 대한 여러 옵션이 있습니다).