打印文件的内容

时间:2012-06-08 10:43:35

标签: c string realloc

openFile(argv[1],"r");
while(characterBuff != EOF)
{
    characterBuff = fgetc(examFile);
    memoryAlloc += 1;
    string = expandRealloc(string, memoryAlloc);
    appendString(string, characterBuff);
    printf("%s\n", string);
}
closeFile();
free(string);

在下面的代码中:我从printf得到的输出给了我像[somehash] D [somehash] E [somehash] S [somehash] K

的尴尬值

我得到的输出字是“DESK”但是从记忆中取出了各种随机的东西,我做错了什么?

注意:以下内容已经分配了malloc(sizeof(char)),并且每次将单个字符添加到字符串时都会进行重新定位。

即我应该得到的输出应该是: d 德 梅 台 但不是那样,我得到了我之前展示过的东西。

编辑:

char* expandRealloc(char* ptrS, size_t n)
{
    void *tmp;
    if((tmp = realloc(ptrS, n)) == NULL)
    {
        printf("Error: Memory leak possible; Closing Program");
        exit(EXIT_FAILURE);
    }
    else
    {
        ptrS = tmp;
        return ptrS;
    }
}

我为realloc写了一个包装器函数。感谢您的帮助,但它仍然无法解决问题,我在尝试printf结果时仍然得到[somecrapmemoryhash] [letter] [somecrapmemoryhash] [letter]。

APPEND STRING:

void appendString(char* inputString, int inputChar)
{
    int stringLenght = strlen(inputString);
    inputString[stringLenght - 1] = inputChar;
    inputString[stringLenght] = '\0';
}

3 个答案:

答案 0 :(得分:4)

调用realloc时,它可能会移动已分配的内存,因此您需要使用realloc返回的值替换指针的旧内容。

尝试

char *temp_string;
    .
    .
    .
temp_string = realloc(string, memoryAlloc);
if(temp_string != NULL)
  string = temp_string;

修改

令我感到震惊的是,这里的许多问题都是使用用户编写的函数来完成长期以来标准库的一部分。修改此代码以使用标准的lib函数而不使用特殊的包装器等,将不再困难,并且可以提高可靠性。作为一个例子,appendString函数似乎是这里遇到的许多困难的根源。如果使用了strcat函数(使用了较小的mod),可以避免大量的恶化和拉毛。

标准库是有充分理由的。它是一致的,可靠的,调试的,有用的,而且 - 它是标准的。如果这里的任何人认为他们自己比数百名为标准库做出贡献的人更聪明,他们很可能是错的。如果有人认为他们不能使用标准库中的功能来执行基本操作,因为他们的需求非常特殊,他们很可能是错误的。 C语言本身并不特别 - 让我们面对它,花括号并不是一件大事:-) - C的力量直接源于“把所有东西放在一个函数中”的哲学 - 即从使用完成任务的函数库。标准库是C程序员需要学习的最基本的东西,它的使用应该是任何有经验的C程序员的第二天性。

分享并享受。

答案 1 :(得分:2)

您的appendString功能错误 - 更改:

void appendString(char* inputString, int inputChar)
{
    int stringLenght = strlen(inputString);
    inputString[stringLenght - 1] = inputChar;
    inputString[stringLenght] = '\0';
}

为:

void appendString(char* inputString, int inputChar)
{
    int stringLength = strlen(inputString);
    inputString[stringLength] = inputChar;
    inputString[stringLength + 1] = '\0';
}

答案 2 :(得分:0)

你的字符串打印问题看起来很可疑,就像你的字符串末尾缺少NULL终止一样...... appendString是否负责添加终结符?