2014-11-17 7 views
2

사용자가 선택한 길이의 문자 배열로 문자열을 읽으려고합니다. 문제는 getchar()이 내 코드에 따라 Enter 키를 눌러 수동으로 개행을 입력 할 때까지 읽기를 중지하지 않는다는 것입니다. 나는 다른 사람들의 글을 읽었으며, 왜 내가 이런 식으로 할 수 없는지를 이해한다. 이것은 내 과제물에 완전히 모순된다. getchar의 입력 문자열

int chPrompt(int nchars); 
void strInput(char str[], int nchars); 

int main(void) { 
    int nchars = chPrompt(nchars); 
    char str[nchars]; 

    strInput(str, nchars); 

    return 0; 
} 

int chPrompt(int nchars) { 
    printf("How many chars do you need to input? >"); 

    return scanf("%i", &nchars); 
} 

void strInput(char str[], int nchars) { 
    int i = 0; 

    while((str[i] = getchar()) != '\n') { 
     if(i > nchars-1) 
      break; 
     i++; 
    } 
    str[i] = '\0'; 

    //Troubleshooting 
    printf("%s %d", str, strlen(str)); 
} 

은 유인물의 말씀입니다 :

입력은 키보드에서 문자열 (공백 포함) 우리가 를 얘기 기술을 사용하여 (getchar가()와 함께 도착하지 않으면 서()는 fgets() 또는 scanf()), 이 추가되어 최대 값은 80 자까지 입력됩니다. 입력 후에 적절한 위치에 널 (null)이 있는지 확인하십시오.

우리가 클래스에서 이야기 한 기술은 getchar가 char 배열에 할당 된 while 루프입니다.

내 질문 : 교수님은 그의 지시에 대해 매우 신중합니다. 이 유인물에서 그는 구체적으로 80까지의 금액을 입력하라는 메시지를 전하고 있습니다. 이것은 getchar의 기능과 모순되는 것입니까? 이 '기법'을 사용하여 문자열의 길이를 제한하는 방법이 있습니까?

내가 발견 한 스레드 중 일부에서는 사람들이 OS에 의존한다고 언급했습니다. 그래서, 문제가 있다면, 나는 Windows 8.1에 있습니다.

+0

'숯 STR [nchars]'→ '숯 STR [nchars + 1]'. null 문자를위한 공간을 놓쳤습니다. 당신이 원하는 것은 "버퍼 된 입력 모드"입니다. –

+0

@GrzegorzSzpetkowski Taken care! 알림 주셔서 감사. 버퍼링 된 입력 모드를 해결할 수있는 방법이 있습니까? 아니면 유인물을 잘못 해석합니까? – LukeFi

+0

"이것은 getchar의 기능과 모순되는 것입니까?" - 아니, 맞지 않아. getchar가 fgets와 섞여있는 것처럼 보입니다. –

답변

2

작전 코드 가깝습니다.

"getchar()은 Enter 키를 눌러 수동으로 줄 바꿈을 입력 할 때까지 읽지 않습니다."라는 잘못된 정보입니다.
일반적인 사용자 입력은 라인 버퍼입니다. 이 입력 될 때까지 아무 것도 프로그램에 제공되지 않습니다. 이 때 전체 프로그램이 프로그램에 제공됩니다. getchar()stdin에서 한 번에 1 char을 소비합니다.

1))에 충분한 버퍼 메모리 @Grzegorz Szpetkowski
2 할당 int와 같은 입력을 읽고 필요한 여분의 판독 할 필요가있다.
3) scanf()의 값을 읽는 횟수로 반환하지 마십시오.
4) 읽어야 할 번호 char을 읽은 후에 나머지 라인을 읽으십시오. @Grzegorz Szpetkowski

getchar()unsigned char 또는 EOF을 반환합니다. 이는 일반적으로 257 개의 다른 결과입니다. getchar()char으로 읽는 것은 그 차이점을 잃습니다.

void strInput(char str[], int nchars) { 
    int i = 0; 
    int ch; 
    while((ch = getchar()) != '\n' && ch != EOF) { 
    if (i < nchars) { 
     str[i++] = ch; 
    } 
    } 
    str[i] = '\0'; 
} 

int main(void) { 
    int nchars = chPrompt(nchars); 
    char str[nchars + 1]; // + 1 
    strInput(str, nchars); 

    //Troubleshooting 
    printf("'%s' %zu", str, strlen(str)); 

    return 0; 
} 

int chPrompt(int nchars) { 
    printf("How many chars do you need to input? >"); 
    if (scanf("%i", &nchars) != 1) { 
    printf("Unable to read #\n"); 
    exit(-1); 
    } 

    // Consume remaining text in the line 
    int ch; 
    while((ch = getchar()) != '\n' && ch != EOF); 

    return nchars; 
} 

참고 : strlen() 반환이/strlen() (가) 오른쪽 형식 지정자 "%zu"를 사용하는, 가장 플랫폼에서 동일하지 않을 수 있습니다, size_t하지 int 입력합니다.대안 적으로 사용

printf("'%s' %d", str, (int) strlen(str)); 
+0

어떤 이유로, nchars를 입력 한 후 문제 해결에 사용했던 printf를 출력 한 다음 프로그램을 종료합니다. 나는 Ctrl + z로 원래의 코드로 돌아 왔고 이제는 내 코드가 똑같이하고있다. 무엇이 잘못되었는지 확신하지 못한다 : S – LukeFi

+1

@LukeFi :'scanf()'호출은'stdin'에 "고립 된"'\ n '문자를 남겨 둡니다. 'while (getchar()! = '\ n');'(사용하기 쉽도록 들여 쓰기가있는 별도의 줄에 세미콜론을 넣을 수 있습니다)을 사용하십시오. 'scanf()'와 앞으로 나오는'getchar()'을 결합하는 것은 약간 까다 롭습니다. –

+0

@LukeFi Grzegorz Szpetkowski가 정확합니다. 귀하의 게시물 당, 코드에 길이 80을 하드 코딩하고 쿼리하지 않을 수있는 것처럼 보입니다. – chux

0

이 코드는 (당신이 입력으로 사용자가 더 이상 80 개 문자 등을 할 수 있도록 예를 들어, 입력 된 문자를 계산) 몇 가지 더 많은 장소에서 수정 될 수 있지만, 이것은 올바른 방향을 가리 킵니다 :

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

void strInput(char str[], int nchars); 

int main(void) { 
    int nchars = 0; 

    printf("How many chars do you need to input?\n"); 
    scanf("%d\n", &nchars); 

    char str[nchars+1]; 

    strInput(str, nchars); 

    return 0; 
} 

void chPrompt(int nchars) { 
} 

void strInput(char str[], int nchars) { 
    int i = 0; 

     char c; 
    while((c = getchar()) != '\n' && i <= (nchars-1)) { 
      str[i] = c; 
      i++; 
    } 
    str[i] = '\0'; 

    printf("%s %d\n", str, (int)strlen(str)); 
} 
+0

변경 사항을 적용했지만 어떤 이유로 nchars 프롬프트 바로 다음에 프로그램이 종료됩니다. 유일한 출력은 문제 해결을 위해 사용했던 printf 문입니다. – LukeFi

+0

할 일이 없으므로 종료됩니다. 원하는대로 변경하십시오. – syntagma

+0

좋아요, 이제 유인물의 기준과 일치하는 것 같아요. 문자열에 지정된 양을 읽지 만 사용자가 Enter 키를 눌러 수동으로 개행을 입력 할 때까지 getchar은 여전히 ​​버퍼를 채 웁니다. 그 주위에 방법이 없을까요? 도움을 주셔서 감사합니다 :) – LukeFi