2014-11-25 3 views
-1

내 목표는 stdin에 쓴 것과 같은 텍스트를 반환하는 함수입니다. 아래의 코드를 컴파일의 결과 :임의의 텍스트를 출력으로 사용

#include <stdio.h> 

char chain[990]; 
int znaki() 
{ 
scanf("%s", chain); 
int i=0; 
do{ 
    putchar(chain[i]); 
    i++; 
} 
while(chain[i]!=10); 
return 0; 
} 
int main(int argc, char **argv) 
{ 
znaki(); 
return 0; 
} 

내가 얻을 :

MyOwnText

MyOwnText

많은

라인 단지 리눅스

에서 임의 고양이는/dev/첫 번째 줄 내 입력과 같은 몇 가지 임의의 텍스트의

. 왜?

+0

결과물은 무엇입니까? 이것이 왜 정상적인 산출물이 아닌가? –

답변

0
  1. 배열이 있습니다.
  2. 사용자에게 단어를 물어보고 해당 배열의 시작 부분에 저장했습니다.
  3. 그런 다음 배열을 인쇄했습니다.

내가 입력 한 내용이 인쇄 된 이유는 분명합니다. 10.까지 코드 버퍼 초기화 바와 같이 함께 숯을 발견 쇄 (추가)로부터

+0

당신은 나를 이해하지 못했습니다. 입력 : MyOwnText 출력 : MyOwnText & 52 32 * %! – nuser

+0

정확히 그 입력에 대한 출력으로 기대하는 것입니다. 너는 무엇을 기대 했는가? –

1
do { 
    putchar(chain[i]); 
    i++; 
} while(chain[i]!=10); 

이 코드가 인쇄 된 문자, 그것은 다른 프로그램에서 몇몇 랜덤 데이터로 채워진다. 그리고 그 데이터를 봅니다. 아마, 당신은 배열에서 처음 10 개 문자를 인쇄 할

do { 
    putchar(chain[i]); 
    i++; 
} while(i != 10); 

같은 것을 쓰고 싶었다.

그리고 코드는 버퍼 오버 플로우에 취약 할 수 있습니다.

0

chain[]가하는 비 공백 문자로 가득 (10)

chain의 값이없는 - 그 "%s"이 할 scanf()을 지시하는 것입니다 : 스캔과 비 공백 char을 저장합니다. 10은 일반적으로 '\n'이며 공백입니다.

char chain[990]; 
scanf("%s", chain); 
... 
while(chain[i]!=10); 

대신 라인을 읽을 fgets()를 사용합니다.

int znaki(void) { 
    char chain[990]; 
    while (fgets(chain, sizeof chain, stdin) != NULL) { 
    int i=0; 
    while (chain[i] != '\n' && chain[i] != '\0') { 
    putchar(chain[i]); 
    i++; 
    } 
    return 0; 
} 
관련 문제