2017-10-30 6 views
0

를 사용하여 두 개의 문자열을 입력?, 나는 다음과 같이이를 사용하려면 : 당신은 첫 번째 scanf()kid\n까지 입력을 읽고방법 C에서 scanf와 두 개의 문자열을 입력 할 수는 scanf 기능

#include <stdio.h> 
#include <string.h> 
main() 
{ 
    char kid[25]; 
    char color[10]; 
    scanf("%24[^\n]", kid); // kid name 
    scanf("%9[^\n]", color); 
    printf("%s\'s favorite color is %s.\n", kid, color); 
    return 0; 
} 
+2

표시되는 코드에 어떤 문제가 있습니까? [좋은 질문을하는 법을 읽으십시오] (http://stackoverflow.com/help/how-to-ask)를 읽은 다음 * 질문을 편집하여 문제가 무엇인지 자세히 설명하십시오. –

+2

' "% 24 [^ \ n]"'->' "% 24 [^ \ n] % * c"' – BLUEPIXY

+2

왜 작업에 적합하지 않은 함수를 사용합니까? @ BLUEPIXY의 솔루션은 "작동"하지만 입력이 너무 길면 (문자가 삭제 된 경우) 복구 할 수있는 방법이 없습니다. 'fgets()'를 사용하거나 코드를 POSIX 시스템에 묶을 수 있다면'getline()'을 사용하십시오. –

답변

1

. 그러나 scanf()\n을 읽지 않으며 입력 버퍼에 남아 있습니다.

다음에 scanf()이 완료되면 \n이 표시되어 아무 것도 쓰기 전에 color에 기록됩니다.

당신은 \n 같은 공백 문자를 읽

scanf("%24[^\n] ", kid); 
scanf("%9[^\n]", color); 

에게 [^\n] 후 공간을 할 수 있습니다.

%*c의 경우는 문자를 읽을 원인이됩니다 scanf()에서

scanf("%24[^\n]%*c", kid); 

%*c처럼 사용되지만 그것은 어디 할당되지 않습니다. *은 대입 억제 문자입니다. here을 참조하십시오.

\n 전에 정확히 25자를 입력하면 %*c\n을 입력 버퍼에 그대로두고 마지막 문자를 읽습니다.

scanf() 이외의 기능을 사용할 수 있다면 fgets()을 사용하는 것이 좋습니다.

fgets(kid, sizeof(kid), stdin); 

를 수행하지만 fgets()kid으로뿐만 아니라 \n을 읽을 것이라는 점을 기억하십시오. 당신이 읽고있는이 때문에 \n

kid[strlen(kid)-1]='\0'; 

처럼 제거 할 수 있습니다, 읽을 수 문자 효과적으로 1 적습니다.

+1

고맙습니다. 그것은 내 문제를 해결, –

+0

@ 펠릭스 나는 그것을 편집했습니다. –

+0

답장을 보내 주셔서 감사합니다. 임씨는 C 언어를 처음 사용하며, 다음과 같이 최종 코드를 작성했습니다 : char kid [8], color [10]; printf ("네 번째 아이 이름은 :"); fgets (kid, sizeof (kid), stdin); printf ("네 번째 색상 이름은 :"); fgets (color, sizeof (color), stdin); printf ("% s 님의 즐겨 찾는 색상은 % s입니다. \ n", 아이, 색상); return 0; 하지만 달리고 이름/색상을 입력하면 다음과 같은 대답을 얻었습니다. 마이크 ' 좋아하는 색은 검은 색 입니다. 아이 이름과 끝에있는 점은 differen 라인에 있습니다. 어떻게 해결할 수 있습니까? –

0

문제는이 줄이 \n 문자를 스트림에서 읽지 않는다는 것입니다.

scanf("%24[^\n]", kid); // kid name 

그래서 아이 이름을 읽지 만 개행 문자는 제거하지 마십시오. 따라서 다음 scanf()은 입력 스트림에서 반환 문자 만 보게되므로 빈 색상이 표시됩니다.

if (scanf("%24[^\n]", kid) == 1) { // kid name 
    char term; 
    while (scanf("%c", &term) == 1 && term != '\n') { 
     /* read characters until you can't read or you reach the end of line */ 
    } 
} 
else { 
    /* Error */ 
} 

키즈가 이상 24 자 이름을 사용자가 입력 한 후 읽고 이러한 문자를 던져 (또는 적절한 오류 처리를 수행)해야하는 경우

. 어린이 이름의 끝 부분에 '\n' 문자가 표시됩니다.

참고 : 위의 while 루프는 설명을위한 것입니다. 더 좋은 방법이 있습니다.

if (scanf("%24[^\n]", kid) == 1) { // kid name 
    scanf("%*[^\n]"); // Note. You can not use "%*[^\n]\n". This will fail if just a newline 
    scanf("\n");  // So split into two lines (the first may read nothing). 
} 
else { 
    /* Error */ 
}