2012-11-15 1 views
1

Visual C++ 6.0을 사용하고 있으며 아래 코드가 있습니다.strcpy가 전체 문자열을 복사하지 않습니다.

char filename[1000], string[5]; 
FILE *fin; 
strcpy(filename, argv[3]); 
if ((fin = fopen(filename, "r")) != NULL) 
{ 
    fgets(string, 100, fin); 
    string[strlen(string)-1] = NULL; 
    printf("filename = %s\n", filename); 
    printf("argv[3]= %s\n", argv[3]); 
    printf("string = %s\n", string); 
} 

argv [3]은 전체 경로 및 파일 이름입니다. C는 : 바탕 화면 \ file.txt 파일 \ 사용자 \하고, 파일의 내용은 따라서 "1"은 "문자열"변수에 저장해야

1 
2 
3 

입니다. 그러나

, 약 1 4 실행 중, 나는 마지막 "t"를 누락 출력

filename = C:\Users\Desktop\file.tx 
argv[3] = C:\Users\Desktop\file.txt 
string = <very long garbage value> 

strcpy(filename, argv[3]); 

전체 문자열을 복사하지 않았다 얻을 것? 그리고 파일이 존재해서는 안되기 때문에 왜 fin이이 경우 NULL이 아닌지?

이 코드는 다중 스레드 프로그램에 있지만 단 하나의 스레드 만이 코드를 실행한다고 추가해야합니다. 당신은 C를 사용하는 경우

+0

까지 읽고 [] '와'FILE' 대신'std :: string'과 스트림을 사용합니까? – DCoder

+0

저는 char []와 FILE에 대해 더 잘 알고 있습니다. 이것은 변화를 가져 왔을 까? – Rayne

+0

네, 그렇습니다. 'std :: string'은 대부분의 다른'std' 컨테이너와 마찬가지로 자동으로 확장하여 사용자가 입력 한 모든 데이터를 포함하므로 길이와 메모리 할당을 수동으로 추적하지 않아도됩니다. – DCoder

답변

1
string[5]; 

당신은 단지 4 개 문자와 널 (NULL) 종료하지만는 fgets를위한 충분한 공간을 할당 한 이유는 여전히 '문자를 사용하고, ++ (100)

fgets(string, 100, fin); 
+0

예, 그렇지만 fgets는 "1"다음에 \ n 파일을 읽지 않습니다. 어쨌든,이 줄은 strcpy 다음에 오는데, 나는 이것이 "string"을 얻는 쓰레기 값의 주된 문제라고 믿는다. – Rayne