2017-02-18 6 views
1

Я знаю, что подобные вопросы были опубликованы раньше, но я не смог решить проблему для моего дела.Неожиданные символы в конце массива символов - C

У меня есть следующий код C:

#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); 
    } 
} 

Он работает, как ожидается, для каждой строки ожидать для textString4, который выдает в 14 «двойки как и ожидалось, а затем случайный характер, а затем 14» C (в предыдущей строке) по какой-то причине, но другие строки не имеют этой проблемы.

Я предположил, что это проблема памяти, но когда я заменил
char textStringX[tLengths[i]+1];
с char *textStringX = malloc(sizeof(char) * (tLengths[i] + 1));
результат был идентичен.

Я новичок в C, так что извиняюсь, если решение этого тривиально.

+1

Независимо от значения 'i', когда вы делаете' sprintf (iChar, "% d", i); 'вы *** будете записывать из границ массива' iChar'. Не забудьте о терминаторе! –

+0

Кроме того, почему бы вам просто не «snprintf» прямо в 'filePathText'? И подобный код с копированием подобен этому, это хороший пример для выведения общего кода в функцию. –

+0

'for (i = 0; i <1; i ++)' - Это действительно то, что вы намереваетесь? 'i' никогда не выйдет за пределы значения 0. – ryyker

ответ

1

Первые вопросы связаны с строкой. Следующие строки:

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

это проблема, в том, что вы создали массив символов, iChar, с комнатой для только один char, то в следующей строке попробуйте использовать функцию строки sprintf поместить два символа в iChar: значение i (0 на данный момент) и NULL символ. Вам нужно создать iChar больше пространства: то есть

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

Ев. ноль будет выглядеть следующим образом: |0|\0|\0|
99, как это: |9|9|\0|

В C, без прекращения NULL, вы не имеете C string. Строковые функции не будут работать должным образом без строки C.

Поскольку запись в iChar не выполняется в вызове выше, следующие строки в вашем коде, также строковые функции всегда ожидают NULL с завершающим символом массивы. все остальное заставит их терпеть неудачу:

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

Потому что я не знаю, содержимое текстового файла, я не могу принять ваш код за пределы этого. Но обращайтесь к этим строковым вопросам, затем переходите через свой код по строкам. Я считаю, что большинство вопросов, которые вы цитируете, будут рассмотрены.

+0

Символ на самом деле называется 'NUL', с одним L. – Spidey

+0

Я раньше не знал о нулевом символе и строковых функциях, поэтому это полезно знать.Я увеличил размер iChar до 2, и теперь он работает, но сохраняет его как имя файла «_text1.txt», но весь смысл того, что iChar должен был сохранить файл как «0_text1.txt» –

+0

Что касается содержимого файлов, то они не существует до тех пор, пока fopen не будет вызван –

Смежные вопросы