2017-02-18 4 views
1

비슷한 질문이 게시 된 적이 있지만 내 문제를 해결할 수 없었습니다.문자 배열 끝 부분에 예기치 않은 문자가 있음 - C

나는 다음과 같은 C 코드가 :

14 'D의 등 임의의 문자 다음에 예상 다음 (14')의 C 년대 (이전의 문자열로 출력하는 모든 문자열 textString4 기대할 예상대로 작동
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

int main() 
{ 
    char textChars[4] = { 'A', 'B', 'C', 'D' }; 
    char noMatchChars[4] = { '1', '2', '3', '4' }; 
    int tLengths[5] = { 14, 142, 1414, 14142, 141420 }; 
    int i,j; 

    for (i = 0; i < 1; i++) 
    { 
     char textString1[tLengths[i]+1]; 
     char textString2[tLengths[i]+1]; 
     char textString3[tLengths[i]+1]; 
     char textString4[tLengths[i]+1]; 
     for (j = 0; j < tLengths[i]; j++) 
     { 
      textString1[j] = textChars[0]; 
      textString2[j] = textChars[1]; 
      textString3[j] = textChars[2]; 
      textString4[j] = textChars[3]; 
     } 
     textString1[tLengths[i]] = '\0'; 
     textString2[tLengths[i]] = '\0'; 
     textString3[tLengths[i]] = '\0'; 
     textString4[tLengths[i]] = '\0'; 

     FILE *fp; 
     char filepathPattern[14]; 
     char filepathText[11]; 
     char iChar[1]; 
     sprintf(iChar, "%d", i); 

     strcpy(filepathText, iChar); 
     strcat(filepathText, "_text1.txt"); 
     fp = fopen(filepathText, "w"); 
     fprintf(fp, textString1); 
     fclose(fp); 
     memset(filepathText,0,strlen(filepathText)); 

     strcpy(filepathText, iChar); 
     strcat(filepathText, "_text2.txt"); 
     fp = fopen(filepathText, "w"); 
     fprintf(fp, textString2); 
     fclose(fp); 
     memset(filepathText,0,strlen(filepathText)); 

     strcpy(filepathText, iChar); 
     strcat(filepathText, "_text3.txt"); 
     fp = fopen(filepathText, "w"); 
     fprintf(fp, textString3); 
     fclose(fp); 
     memset(filepathText,0,strlen(filepathText)); 

     strcpy(filepathText, iChar); 
     strcat(filepathText, "_text4.txt"); 
     fp = fopen(filepathText, "w"); 
     fprintf(fp, textString4); 
     fclose(fp); 
    } 
} 

) 어떤 이유로하지만 다른 문자열이이 문제가 없습니다.

I는 메모리 문제였다 가정하지만 char *textStringX = malloc(sizeof(char) * (tLengths[i] + 1));
으로
char textStringX[tLengths[i]+1];
대체 할 때 그 결과는 동일 하였다.

저는 C가 처음인데, 이것에 대한 해결책이 사소한 경우 사과드립니다.

+1

'i'의 값에 상관없이,'sprintf (iChar, "% d", i);를하면,'***는 *** 배열의'iChar' 배열을 쓸 것입니다. 터미네이터를 잊지 마세요! –

+0

또한'fileprintText'를'snprintf'로 직접 쓰지 않으시겠습니까? 그런 코드를 복사하여 붙여 넣은 코드는 일반적인 코드를 함수로 분리하는 좋은 경우입니다. –

+0

'for (i = 0; i <1; i ++)'- 이것은 정말로 당신이 원하는 것입니까? '나는'0의 가치를 결코 넘어 서지 않을 것입니다. – ryyker

답변

1

첫 번째 문제는 문자열 관련입니다. 다음 줄 :

char iChar[1]; 
sprintf(iChar, "%d", i); 

후 바로 다음 줄에에 두 개의 문자를 배치 할 문자열 함수 sprintf를 사용하려고하면 하나의 char위한 공간으로, char 배열, iChar을 생성한다는 점에서 문제가 있습니까 iChar : i (이 시점에서 0) 및 NULL char입니다. 더 많은 공간이있는 iChar을 만들어야합니다. 즉

char iChar[3]; // will allow printing up to any two digit value + NULL. 

예 : 제로는 다음과 같이 보일 것이다 :이 같은 |0|\0|\0|
99 : C에서 |9|9|\0|

을하는 NULL 종료없이, 당신은 C string이 없습니다. 문자열 함수가 C 문자열없이 제대로 작동하지 않습니다.

위의 호출에서 iChar에 대한 쓰기가 실패하므로 코드의 다음 줄과 문자열 함수도 항상 NULL 종료 문자 배열을 필요로합니다. 아무것도 그들이 실패 할 것이다 : 나는 당신의 텍스트 파일의 내용을 모르기 때문에

strcpy(filepathText, iChar); 
strcat(filepathText, "_text1.txt"); 

, 나는이 넘어 코드를 취할 수 없습니다. 그러나 이러한 문자열 문제를 해결 한 다음 줄마다 코드를 단계별로 실행하십시오. 나는 당신이 인용 한 대부분의 문제가 해결 될 것이라고 믿습니다.

+0

이 문자는 사실 NUL이라고 불리우며 하나의 L을 가지고 있습니다. – Spidey

+0

알기에 앞서 null 문자와 문자열 함수에 대해 몰랐습니다.iChar의 크기를 2로 늘렸지만 지금은 작동하지만 파일 이름은 "_text1.txt"로 저장되지만 iChar를 사용하면 파일을 "0_text1.txt"로 저장할 수 있습니다. –

+0

파일의 내용은 fopen이 호출 될 때까지 존재하지 않습니다. –

관련 문제