Я знаю, что подобные вопросы были опубликованы раньше, но я не смог решить проблему для моего дела.Неожиданные символы в конце массива символов - 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, так что извиняюсь, если решение этого тривиально.
Независимо от значения 'i', когда вы делаете' sprintf (iChar, "% d", i); 'вы *** будете записывать из границ массива' iChar'. Не забудьте о терминаторе! –
Кроме того, почему бы вам просто не «snprintf» прямо в 'filePathText'? И подобный код с копированием подобен этому, это хороший пример для выведения общего кода в функцию. –
'for (i = 0; i <1; i ++)' - Это действительно то, что вы намереваетесь? 'i' никогда не выйдет за пределы значения 0. – ryyker