2012-06-08 189 views
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的输出给了我喜欢[somehash] d [somehash] E [somehash] S [somehash]ķ打印文件的内容

ackward值我得到的输出字是“DESK”,但是从内存中取出所有类型的随机垃圾,我做错了什么?

注意:以下内容已分配给malloc(sizeof(char)),并在每次将单个字符添加到字符串时进行实时定位。

即输出我应该得到应为: d 德 德 台的 而是说我得到我之前所示的U的事情。

编辑:

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'; 
} 
+0

我想这是C/C++? –

+0

是的,它是C,忘了添加 –

+3

开始的一个大问题 - 你的realloc调用中断 - 查看realloc的手册页 –

回答

4

realloc被调用时,它可以移动分配的内存,所以你需要通过realloc的返回值来代替指针的旧内容。

尝试

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

编辑

这令我更加这里的问题是使用的用户编写的函数做事情早就有标准的一部分图书馆。修改此代码以使用标准库函数而不使用特殊的包装器等,不会更困难,并且会导致更高的可靠性。作为一个例子,appendString函数似乎是这里遇到的很多困难的来源。如果使用strcat函数(对于源代码使用较小的mod),则可以避免大量的恶化和拉毛。

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

分享和享受。

+0

虽然如果realloc失败(即返回NULL),这会导致内存泄漏 - 您应该首先将realloc的结果分配给临时指针。 –

+0

@PaulR - 好点 - 改变的例子。 –

+0

写了一个realloc的包装函数,并对其进行了修改,但它仍然无法解决打印问题,这对我来说是一个问题。代码的内容反映到第一篇文章中。 –

0

您的字符串打印问题看起来像是缺少NULL终止在您的字符串末尾...... appendString照顾添加终止符?

+0

是的,它增加了一个终结者。请注意,我的问题是不打印:DESKfo0932jfjewf98wjef98wejf等但D [Psunflowersign] E [Psunflowersign]等 –

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'; 
} 
+0

而我仍然得到[字符串的开始[怪异记忆] [ –

+0

]你是如何初始化字符串?你也需要发布这个部分的代码。 –