2013-07-30 3 views
-1

말 예를 들어, 나는 다음과 같은 주요 기능이 있습니다읽기 문자열

int main() 
{ 

    char a[1023]; 

    while (scanf("%s",a) != EOF) 
    { 
     printf("%s ",a); 

    } 
} 

입력 내가 만약을

a ab abc(newline) 

은해야 출력 :

a ab abc(newline) 

하지만 주요 기능 출력

a ab abc (newline) // there is a space between newline and the last string 

문자열을 하나씩 읽고 싶습니다. 문제가 무엇이며 어떻게 그 공간을 삭제할 수 있습니까? 고맙습니다.

+0

'input'은'a'에 값을 저장하고있는 것을 의미합니까, 아니면 명령 행 인수를 의미합니까? –

+0

"% s"을 사용하면 printf에 공백을 넣으라고합니다. – Duck

+0

[가능한 공백을 어떻게 스캔합니까?] (http://stackoverflow.com/questions/6853789/how-do-i-scan-spaces-into-aa-string) – dasblinkenlight

답변

1

printf("%s ",a); 문은 출력하는 각 문자열 다음에 공백을 출력합니다. 더 많은 문자열이있을 경우에만 공간을 출력해야합니다. 동등하게 (쉽게), 출력 공간 이 처음이 아닌 경우 각 문자열 전에 :

int first = 1; 
while (scanf("%s",a) != EOF) { 
    if (!first) printf(" "); 
    printf("%s",a); 
    first = 0; 
} 

또한, 당신이 결코 출력 개행, ...되는 출력으로 줄 바꿈을 설명에도 불구하고

1

독립적 인 학습에 관한 간단한 참고 사항 : 표준 라이브러리 기능을 처음으로 사용하는 경우 해당 설명서를 적어도 한 번 읽어야합니다. 그 이유는 어떤 문제 (또는 유용한 기능)에 대해 아는 즉시 해당 문제를 피하는 (또는 유용한 기능을 사용하는) 방법을 알게 될 것이기 때문입니다. 매뉴얼을 읽으면 실제로 모든 잠재력을 배우고 C의 함정을 피하는 데 도움이됩니다.

처음으로 읽은 내용을 완전히 이해하지 못할 수도 있습니다. 너를 괴롭히지 마라. 그냥 계속 읽으십시오. 이런 일이 발생하면 페이지 하단에있는 내용을 다시 읽은 다음 두 번째로 완전히 이해하려고 시도하는 것이 좋습니다. 최소한 the fscanf manual을 한 번 이상 읽으십시오.


지금은 외딴 곳입니다. 여기저기서 ^ 위 첨자를 볼 수 있습니다. 제 의도는 위에 링크 된 매뉴얼을 읽고 이해함으로써 배웠을 사실에 주석을 달기위한 것입니다.

형식 지정자 %s은 가능한 한 공백이 아닌 공백을 최대한 많이 사용하기 전에 공백을 버립니다. ^. 4 바이트의 공백 문자를 입력한다고 가정하면, 출력에는 4 바이트의 공백 문자가 없습니다.

"This uses four spaces" translates to "This uses four spaces". 

이이 문제를^를 확장 프로그램 사양을 위반 논리적 보인다. 아마도 ^ 대신 %[ 형식 지정자를 사용해야합니다. 이 경우 빈 줄은 일치 실패로 간주되어 줄의 대상이 불확실하므로 scanf의 더 좋은 결과를 처리해야합니다. ^ (어쨌든 권장합니다).이 루프의 길이와 문제의 단순함에서

#include <stdio.h> 

int main(void) { 
    char line[512]; 
    int x; 

    do { 
     x = scanf("%511[^\n]", line); 
     if (x == 0) { 
      /* Match failure caused by inputting an empty line. Print empty line? */ 
      putchar('\n'); 
     } 
     else if (x == 1) { 
      /* Success. */ 
      puts(line); 
     } 

     /* Read and discard the remainder of a line */ 
     do { x = getchar(); } while (x >= 0 && x != '\n'); 
    } while (x != EOF); 
} 

, 당신은 이것에 대한 scanf를 사용하는 것은 아마 문제를 해결하기 위해 잘못된 방법 것을 추론 할 수 있습니다. 배열 scanf에 대한 호출을 line 제거하고 가장 안쪽 루프의 파생을 사용하여 오류 확인 scanf 오류 검사를 제거 할 수 있습니다. 이 같은 것이 멋지게 보입니다.

#include <stdio.h> 

int main(void) { 
    int c; 
    do { 
     c = getchar(); 
    } while (c >= 0 && putchar(c) >= 0 && c != '\n'); 
} 

PS. getchar, putcharmany other standard things에 대한 설명서도 있습니다.

+1

Upvoted for the 수동이지만 가장 최신 버전을 지적하지 않은 손목에 비 유적 인 때리기. 오픈 그룹 기본 사양 이슈 7은 [The Manual] (http://pubs.opengroup.org/onlinepubs/9699919799/), ['fscanf()'] (http://pubs.opengroup.org/onlinepubs /9699919799/functions/fscanf.html), ['getchar()'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/getchar.html), [''putchar()'] (http : // /pubs.opengroup.org/onlinepubs/9699919799/functions/putchar.html). –

+0

현재 버전에 대한 링크가 업데이트되었습니다. 비 유적 손목에 너를 비난한다. (또한 오래된 POSIX 문서에 대한 링크를 제공해 주셔서 감사합니다. 비교를 위해 유용합니다.) –

+0

@ElchononEdelson POSIX와 C 표준간에 fscanf가 다른 점에주의하십시오. C 표준에서 'EOF'는 파일 변환이 성공하기 전에 끝나는 경우에만 반환 될 수 있습니다. * fscanf 함수는 첫 번째 변환 전에 입력 오류가 발생하면 매크로 EOF의 값을 반환합니다 (if any)가 완료되었습니다. 그렇지 않으면 함수는 할당 된 입력 항목의 수를 반환합니다.이 항목은 조기에 일치하지 않는 경우 *에 대해 제공되는 것보다 적거나 심지어는 0 일 수 있습니다. 고맙게도 POSIX와 C'fscanf '를 모두 다루는 코드를 작성하는 것이 어렵지 않다. – Sebivor