2017-03-11 8 views
0

사용자 입력을 두 번 입력 한 다음 결과를 연결하는 프로그램을 작성하려고하는데 문제가 발생합니다.strcat가 원하는대로 작동하지 않습니다.

내 예상 출력은 다음과 같습니다

What would you like your message to be? input 
message received: input 

What would you like your message to be? words 
message received: words 

new message: inputwords 

대신 내가 잘못된 응답을 수신하고 있습니다.

출력을 수신 :

What would you like your message to be? input 
message received: input 

What would you like your second message to be? words 
message received: words 

new message: ??s?inputwords 

첫 번째 질문 :

가 어떻게 올바르게 두 문자열을 연결할 수 있습니까?

또한 :

나는이는 fgets 사이의 버퍼에 남아있는 요소를 삭제 가겠어요 어떻게 각 메시지에 대한 입력의 5 개 문자를 허용하고 있습니다 때문에

은 "쓰레기"로 나머지를 읽지 않고 호출 정렬?

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


int main() { 

    char message[6]; 
    char garbage[9999]; 
    char message2[6]; 

    printf("\nWhat would you like your message to be? "); 
    fgets(message, 6, stdin); 

    printf("message received: %s\n", message); 

    fgets(garbage, 9999, stdin); //this is gross 

    printf("\nWhat would you like your second message to be? "); 
    fgets(message2, 6, stdin); 

    printf("message received: %s\n", message2); 

    fgets(garbage, 9999, stdin); //still gross 

    char newString[25]; 
    strcat(newString, message); 
    strcat(newString, message2); 

    printf("new message: %s\n", newString); 
    return 0; 

} 

참고 : 여기에

내가 사용하고 코드입니다 내가는 fgets의 반환 값을 잡기되어야한다는 것을 알고, 나는 간결이를 떠났다.

+1

'strcat'는 한 문자열을 다른 문자열에 추가합니다. 하지만 인수를 위해 초기화되지 않은 버퍼로 호출했습니다. –

답변

1

귀하의 문제가

char newString[25]; 
strcat(newString, message); 
strcat(newString, message2); 

strcat()는 첫 번째 인수가되었습니다 가정입니다 끝이없는 문자열을 사용하여 초기화됩니다. 첫 번째 호출은 초기화되지 않은 배열을 제공하므로 정의되지 않은 동작이 발생합니다. 수정하려면 첫 번째 호출을 strcpy()으로 변경하십시오. 을 초기화하지 않고 messagenewString으로 복사합니다.

그것이 일반적으로 좋은 생각으로 간주되지 않습니다, 일반적인 기술은 그러나

int c; 
while ((c = fgetc(stdin)) != '\n' && c != EOF) { } 

입니다 입력 라인을 플러시 (즉, 파일의 끝, 읽기 오류까지 읽거나 줄 바꿈이 발생하려면) (fgets()과 같은) 문자 지향 입력과 문자 지향 입력 (예 : fgetc())을 섞으십시오. 두 개는 newline과 같은 것을 다르게 처리하기 때문입니다.

fgets()를 사용하는 대신 (두 번째 형태의 첫 번째 형태는 정수 cbuffer)

char buffer[2]; 
while (fgets(buffer, sizeof buffer, stdin) != NULL && buffer[0] != '\n') {} 
버퍼를 사용하는 것이 필요하다

이다.이 두 옵션은 일부 사람들이 fflush(stdin)을 사용하는 것이 좋습니다 (fgets()를 사용 fgetc() 또는 2에를 사용하여 sizeof int에) 필요한 버퍼의 크기

을 최소화 할 수 있습니다. 이는 C 표준에 따르면 fflush()은 입력 스트림에서 정의되지 않은 동작을 제공한다는 잘못된 생각입니다.

1

strcat은 버퍼가 초기화되지 않은 동안 널 종료 문자열을 필요로합니다. strcpy에 전화로 strcat에 첫 번째 통화를 교체 : 또는

char newString[25]; 
strcpy(newString, message); 
strcat(newString, message2); 

을, 당신은 sprintf 사용할 수 있습니다

char newString[25]; 
sprintf(newString, "%s%s", message, message2);