C에서 stdin 파이프가 비어 있는지 확인하십시오.

Tirth Rami

2D 배열을 채우기 위해 사용자 입력을 사용하고 있습니다. 사용자가 한 줄에 숫자를 입력 한 다음 중첩 루프를 사용하여 다음과 같이 배열을 채 웁니다.

//User inputs: "1 2 3 4 5"

for(i = 0; i < r; i++){
    for(j = 0; j < c; j++){
            scanf("%d", &arr[i][j]);
    }
 }

그러나 문제는 사용자가 6 개의 공간이있을 때 5 개의 int를 입력하면 다른 입력을 기다린다는 것입니다. 숫자가 충분하지 않은지 어떻게 알 수 있습니까?

나는 이것을 사용해 보았지만 작동하지 않았습니다.

for(i = 0; i < r; i++){
    for(j = 0; j < c; j++){
        if (!feof(stdin)){
            scanf("%d", &arr[i][j]);
        }
        else{
            printf("insufficient datapoints\n");
        }
    }
 }
터무니없는

목표를 달성하는 한 가지 방법 은 한 번에 한 줄씩 읽는 대신를 사용하는 fgets()것입니다 scanf(). 그런 다음 strtok()입력 줄을 strtol()토큰으로 나누고 토큰을 숫자로 구문 분석하는 데 사용할 수 있습니다. 와 비교할 때 구조화되지 않은 사용자 입력을 처리 scanf()하는 fgets훨씬 사용 하기 쉽습니다 .

아래 코드가이를 수행합니다. 입력 행에 요소가 너무 많거나 요소가 너무 적거나 요소 중 하나가 유효한 숫자가 아닌 경우 메시지가 인쇄되고 행을 다시 입력해야합니다.

사용자가 각 줄을 입력 strtok()할 때 줄을 토큰으로 나누는 데 사용됩니다. 토큰 구분 기호 목록은에 저장됩니다 delims[]. 토큰은 공백이나 탭으로 구분할 수 있습니다. 구분 기호 자체는 토큰의 일부가 아니므로 이러한 문자를 포함 \r하고 \n줄에있는 최종 토큰의 일부가되지 않도록합니다.

토큰이 발견 strtol()되면 가능한 경우 정수로 변환하는 데 사용됩니다. 에 대한 호출 후 strtol()포인터 tail는 숫자의 일부가 아닌 토큰의 첫 번째 문자를 가리 킵니다. 경우 tail받는 점 NUL터미네이터, 다음 전체 문자열, 숫자로 분석했다 그렇지 않으면 입력이 나쁜 것으로 간주되며 행을 다시 입력해야합니다.

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

#define BUF_SIZE  1000

int main(void)
{
    size_t r = 3;
    size_t c = 5;
    size_t i, j;
    char buffer[BUF_SIZE];
    char *token;
    char *tail;
    const char delims[] = " \t\r\n";
    int arr[r][c];
    int temp_val;

    printf("Enter rows of %zu data elements:\n", c);

    for(i = 0; i < r; i++){
        j = 0;

        if (fgets(buffer, BUF_SIZE, stdin) == NULL) {
            perror("Error in fgets()");
            exit(EXIT_FAILURE);
        }

        token = strtok(buffer, delims);
        while (token != NULL) {
            temp_val = strtol(token, &tail, 10);
            if (*tail == '\0') {
                arr[i][j] = temp_val;
                ++j;
            } else {                // token not a valid number
                j = 0;
                break;
            }

            if (j > c) {            // too many input values
                break;
            }

            token = strtok(NULL, delims);
        }

        if (j != c) {
            printf("insufficient datapoints\n");
            --i;                    // enter row again
        }
    }

    for (i = 0; i < r; i++) {
        for (j = 0; j < c; j++) {
            printf("%5d", arr[i][j]);
        }
        putchar('\n');
    }

    return 0;
}

샘플 상호 작용 :

Enter rows of 5 data elements:
1 2 3 4
insufficient datapoints
1 2 3 4 5 6
insufficient datapoints
1 x 2 3 4
insufficient datapoints
1 2 3 4 x
insufficient datapoints
1 2 3 4 5 x
insufficient datapoints
1 2x 3 4 5
insufficient datapoints
1 2 3 4 5
2 3 4 5 6
 3  4  5    6 7
    1    2    3    4    5
    2    3    4    5    6
    3    4    5    6    7

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Java에서 ResultSet이 비어 있는지 확인하십시오.

분류에서Dev

stdin에 공백이 있는지 확인하십시오.

분류에서Dev

Windows 서비스가 설치되어 있는지 확인하십시오. (C ++)

분류에서Dev

Java에서 HTML 입력 필드가 비어 있는지 확인하십시오.

분류에서Dev

Django에서 쿼리 세트가 비어 있는지 확인하십시오.

분류에서Dev

vb.net에서 Datagridview가 비어 있는지 확인하십시오.

분류에서Dev

C 배열 스택이 비어 있는지 여부를 확인하십시오.

분류에서Dev

jQuery에서 확인란이 선택되어 있는지 확인하십시오.

분류에서Dev

자바 스크립트 : <img>가 비어 있는지 확인하십시오 for 루프에 의해 생성되고 true이면 무언가를하십시오

분류에서Dev

Android의 AlertDialog의 EditText에서 비밀번호가 비어 있는지 확인하십시오.

분류에서Dev

YAML 파일의 데이터가 Python에서 알파벳 순서로되어 있는지 확인하십시오.

분류에서Dev

edittext가 비어 있는지 또는 사용자 정의 대화 상자에 없는지 확인하십시오.

분류에서Dev

managedobjectcontext가 비어 있는지 확인하십시오.

분류에서Dev

db_query가 비어 있는지 확인하십시오.

분류에서Dev

변수가 비어 있는지 확인하십시오.

분류에서Dev

editText가 비어 있는지 확인하십시오.

분류에서Dev

editText가 비어 있는지 확인하십시오.

분류에서Dev

contenteditable div가 비어 있는지 확인하십시오.

분류에서Dev

변수가 비어 있는지 확인하십시오. NodeJS, Express

분류에서Dev

$ this-> db-> get ()이 비어 있는지 확인하십시오.

분류에서Dev

문자열이 비어 있는지 확인하십시오.

분류에서Dev

YouTube 비디오가 Android YoutubePlayer에 있는지 확인하십시오.

분류에서Dev

클립 보드가 자바 스크립트에서 비활성화되어 있는지 확인하십시오.

분류에서Dev

jQuery에서 최대 너비가 설정되어 있는지 확인하십시오.

분류에서Dev

Ionic에서 ion-checkbox가 선택되어 있는지 확인하십시오.

분류에서Dev

디렉토리가 비어 있으면 ksh에서 확인하십시오.

분류에서Dev

URL에 Jquery라는 단어가 있는지 확인하십시오.

분류에서Dev

정의 된 변수가 비어 있거나 Ansible에 없는지 확인하십시오.

분류에서Dev

angularjs. 표에서 하나 이상의 확인란이 선택되어 있는지 확인하십시오.

Related 관련 기사

  1. 1

    Java에서 ResultSet이 비어 있는지 확인하십시오.

  2. 2

    stdin에 공백이 있는지 확인하십시오.

  3. 3

    Windows 서비스가 설치되어 있는지 확인하십시오. (C ++)

  4. 4

    Java에서 HTML 입력 필드가 비어 있는지 확인하십시오.

  5. 5

    Django에서 쿼리 세트가 비어 있는지 확인하십시오.

  6. 6

    vb.net에서 Datagridview가 비어 있는지 확인하십시오.

  7. 7

    C 배열 스택이 비어 있는지 여부를 확인하십시오.

  8. 8

    jQuery에서 확인란이 선택되어 있는지 확인하십시오.

  9. 9

    자바 스크립트 : <img>가 비어 있는지 확인하십시오 for 루프에 의해 생성되고 true이면 무언가를하십시오

  10. 10

    Android의 AlertDialog의 EditText에서 비밀번호가 비어 있는지 확인하십시오.

  11. 11

    YAML 파일의 데이터가 Python에서 알파벳 순서로되어 있는지 확인하십시오.

  12. 12

    edittext가 비어 있는지 또는 사용자 정의 대화 상자에 없는지 확인하십시오.

  13. 13

    managedobjectcontext가 비어 있는지 확인하십시오.

  14. 14

    db_query가 비어 있는지 확인하십시오.

  15. 15

    변수가 비어 있는지 확인하십시오.

  16. 16

    editText가 비어 있는지 확인하십시오.

  17. 17

    editText가 비어 있는지 확인하십시오.

  18. 18

    contenteditable div가 비어 있는지 확인하십시오.

  19. 19

    변수가 비어 있는지 확인하십시오. NodeJS, Express

  20. 20

    $ this-> db-> get ()이 비어 있는지 확인하십시오.

  21. 21

    문자열이 비어 있는지 확인하십시오.

  22. 22

    YouTube 비디오가 Android YoutubePlayer에 있는지 확인하십시오.

  23. 23

    클립 보드가 자바 스크립트에서 비활성화되어 있는지 확인하십시오.

  24. 24

    jQuery에서 최대 너비가 설정되어 있는지 확인하십시오.

  25. 25

    Ionic에서 ion-checkbox가 선택되어 있는지 확인하십시오.

  26. 26

    디렉토리가 비어 있으면 ksh에서 확인하십시오.

  27. 27

    URL에 Jquery라는 단어가 있는지 확인하십시오.

  28. 28

    정의 된 변수가 비어 있거나 Ansible에 없는지 확인하십시오.

  29. 29

    angularjs. 표에서 하나 이상의 확인란이 선택되어 있는지 확인하십시오.

뜨겁다태그

보관