2014-11-19 2 views
-2

사용자가 다음과 같은 형식으로 내용을 입력하도록 요청하는 중입니다. 그런 다음 문자열에 "cd"를 저장하고 다른 문자열에 "directory"를 저장합니다.strncpy 함수가 제대로 작동하지 않습니다.

void main() 
{ 
    char buf[50], cdstr[2], dirstr[50]; 

    printf("Enter something: "); 
    fgets(buf, sizeof(buf), stdin); 

    //store cd in cdstr 
    strncpy(cdstr, buf, 2); 
    printf("cdstr: %s(test chars)\n", cdstr); 

    //store directory in dirstr 
    strncpy(dirstr, buf+3, sizeof(buf)-3); 
    printf("dirstr: %s(test chars)\n", dirstr); 
} 

출력은 입력과 같습니다 : CD의 경로 이유

cdstr: cdcd pathname //incorrect answer 
(test chars)   //an extra "\n" 
dirstr: pathname  //correct answer 
(test chars)   //an extra "\n" 

여기 내 코드는?

+0

힌트 : buf''의 데이터 유형을 찾아서'버피 + 3'를 분석 할 수 있습니다. 또한,'strncpy()'를 사용할 때 null을 확인하십시오. –

+1

'strncpy'는 복사 된 문자에 end-of-string 문자 ('\ 0')를 추가하지 않기 때문에 검사하십시오. 게다가'cdstr'에'\ 0'을위한 공간을 확보하지 않았습니다. –

+0

여분의'\ n'은'fgets'가 항상'\ n'을 포착하기 때문입니다. 이것은 모두 일반적인 지식입니다. 'strncpy'와'fgets' 문서를 공부 해보십시오. –

답변

1

strncpy(cdstr, buf, 2)을 수행 한 후 cdstrchar 배열에 NULL 종료 문자열이 없기 때문입니다. cdstr[2] = '\0'을 : 당신은 3 cdstr 길이를 변경하고 추가하여 문제를 해결할 수

void main() 
{ 
    char buf[50], cdstr[3], dirstr[50]={0}; 

    printf("Enter something: "); 
    fgets(buf, sizeof(buf), stdin); 

    //store cd in cdstr 
    strncpy(cdstr, buf, 2); 
    cdstr[2] = '\0'; 
    printf("cdstr: %s(test chars)\n", cdstr); 

    //store directory in dirstr 
    strncpy(dirstr, buf+3, sizeof(buf)-3); 
    printf("dirstr: %s(test chars)\n", dirstr); 
} 
+0

'sizeof (buf) -3'의 문제점은 무엇입니까? – syntagma

+0

이제는 '\ 0'을 cdstr에 추가 한 후 cdstr과 (테스트 문자) 사이에 지저분한 코드가 표시됩니다. 그것은 다음과 같습니다 : cd? (테스트 문자). – user3368506

+0

정말입니까, 컴파일 했습니까? – syntagma

관련 문제