char数组末尾的意外字符 - C.

时间:2017-02-18 22:23:53

标签: c arrays string char

我知道之前发布了类似的问题,但我无法解决我的问题。

我有以下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'D',随后是随机字符,然后由于某种原因输出14'C(前一个字符串),但其他字符串没有此问题。

我认为这是一个记忆问题,但是当我更换时
char textStringX[tLengths[i]+1];
char *textStringX = malloc( sizeof(char) * ( tLengths[i] + 1 ) ); 结果是一样的。

我是C的新手,如果对此的解决方案很简单,那么道歉。

1 个答案:

答案 0 :(得分:1)

第一个问题与字符串相关。以下几行:

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

是一个问题,因为你创建了一个char数组iChar,只有一个char的空间,然后在下一行尝试使用字符串函数sprintf来将两个字符放入iChari的值(此时为0)和NULL字符。您需要创建具有更多空间的iChar:即

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

EG。零看起来像这样:|0|\0|\0|
    99像这样:|9|9|\0|

在C中,没有NULL终止,您没有 C string 。没有C字符串,字符串函数将无法正常工作。

因为对iChar的写入在上面的调用中失败,所以代码中的下一行,也是字符串函数总是期望NULL终止的char数组。其他任何事情都会导致他们失败:

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

因为我不知道你的文本文件的内容,所以我不能把你的代码超出这个范围。但要解决这些字符串问题,然后逐行逐步执行代码。我相信你引用的大部分问题都将得到解决。