2014-06-14 2 views
1

명령 줄에서 숫자를 getchar()으로 읽고 모든 공백을 isspace()으로 제거한 다음 putchar()으로 인쇄하십시오. 그러나 다음 코드는 공백을 제거하지 않습니다. 입력 10 110 1의 결과로 연결됩니다.isspace 및 getchar()가있는 공백을 무시하십시오.

실수를 찾는 것을 도와 줄 수 있습니까? 고맙습니다!

int main(void){ 

    char input[UINT_MAX]; 
    int i = 0; 
    while (i < UINT_MAX && (input[i] = getchar()) != '\n' && !isspace(input[i])){ 
     i++; 
    } 
    if (i == UINT_MAX) { 
     printf("Too long"); 
    } 
    else { 
     input[i] = '\0'; 
    } 
    i = 0; 

    while(input[i]) { 
     putchar(input[i]); 
     i++; 
    } 

    return 0; 
} 

추가 헤더를 사용할 수 없습니다. 위의 기능에만 국한됩니다.

+4

많은 시스템이 1MB 이상의 스택 크기를 처리 할 수 ​​없으므로 'char input [UINT_MAX];'는 피하여야합니다 ('unsigned int'는 32 비트라고 가정). – ouah

+0

당신의 코드는 예상대로'10'을 출력합니다 (버퍼 크기를 고칠 때) : http://ideone.com/CSSTEv – interjay

답변

0

문자 배열에 4 기가 바이트를 할당하는 것은 미친 짓입니다! 적당한 값을 선택하고 그것을위한 상수를 정의하십시오.

#include <stdio.h> 
#include <ctype.h> 

#define MAX_INPUT 10000 

int main() { 
    char input[MAX_INPUT + 1]; 
    int i = 0, c; 

    while (i < MAX_INPUT && ((c = getchar()) != EOF) && c != '\n') 
    if (!isspace(c)) 
     input[i++] = c; 
    input[i] = '\0'; 

    for (i = 0; input[i]; i++) 
    putchar(input[i]); 
    putchar('\n'); 

    return 0; 
} 
2

(댓글에서 언급 한 바와 같이 배열, 합리적인 작은 값을 바인딩 한 후) 코드를 해결하는 가장 짧은 방법은 루프 조건에서 isspace와()를 제거하고 대신 내가 내부 ++ 전에 추가하는 것입니다 loop body as

if isspace(input[i]) continue   

마찬가지로, ws를 찾을 때 처리를 중지합니다. 대신 i를 늘리지 않고 전달하여 다음 입력 문자로 이동하십시오. 또한 i == bound이면 중복 검사를 제거해야하므로 현재 else 절에있는 내용이 항상 실행됩니다 (마지막 문자가 ws 인 경우 '\ 0'으로 덮어 써야 함).

관련 문제