1
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 获得的输出给了我 ackward 值,例如 [somehash]D[somehash]E[somehash]S[somehash]K

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

注意:以下内容已使用 malloc(sizeof(char)) 分配,并在每次将单个 char 添加到字符串时重新分配。

即我应该得到的输出应该是:D De Des Desk 但我得到的不是我之前给你看的东西。

编辑:

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 写了一个包装函数。感谢您的帮助,但它仍然没有解决问题,我在尝试打印结果时仍然得到 [somecrapmemoryhash][letter][somecrapmemoryhash][letter]。

附加字符串:

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

3 回答 3

4

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

尝试

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

编辑

令我震惊的是,这里的大部分问题是使用用户编写的函数来完成长期以来一直是标准库一部分的事情。在不使用特殊包装器等的情况下修改此代码以使用标准库函数将不再困难,并且会导致更高的可靠性。例如,appendString 函数似乎是这里遇到的许多困难的根源。如果改为使用 strcat 函数(对源代码进行少量修改),则可以避免大量的恶化和拉扯头发。

标准库的存在是有充分理由的。它是一致的、可靠的、经过调试的、有用的,而且——嗯——它是标准。如果这里有人认为他们自己比为标准库做出贡献的数百人更聪明,那么他们很可能是错的。如果这里有人认为他们不能使用标准库中的函数来执行基本操作,因为他们的需求非常特殊,那么他们很可能是错误的。C 语言本身并不是特别特别——让我们面对现实吧,花括号并不是什么大不了的事 :-)——C 的力量直接来自“把所有东西都放在一个函数中”的哲学——即来自使用完成任务的函数库。标准库是初级C程序员需要学习的最基本的东西,

分享和享受。

于 2012-06-08T11:06:58.647 回答
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';
}
于 2012-06-08T13:27:43.010 回答
0

您的字符串打印问题看起来很可疑,就像您的字符串末尾缺少NULL终止符......是否appendString需要添加终止符?

于 2012-06-08T11:31:08.257 回答