我需要從給定的字符串或單詞中刪除標點符號。這裏是我的代碼:爲什麼我不能釋放內存?(調試錯誤)
void remove_punc(char* *str)
{
char* ps = *str;
char* nstr;
// should be nstr = malloc(sizeof(char) * (1 + strlen(*str)))
nstr = (char *)malloc(sizeof(char) * strlen(*str));
if (nstr == NULL) {
perror("Memory Error in remove_punc function");
exit(1);
}
// should be memset(nstr, 0, sizeof(char) * (1 + strlen(*str)))
memset(nstr, 0, sizeof(char) * strlen(*str));
while(*ps) {
if(! ispunct(*ps)) {
strncat(nstr, ps, 1);
}
++ps;
}
*str = strdup(nstr);
free(nstr);
}
如果我的主要功能是簡單的一個:
int main(void) {
char* str = "Hello, World!:)";
remove_punc(&str);
printf("%s\n", str);
return 0;
}
它的工作原理!輸出是Hello World
。
現在我想讀取一個大文件並從文件中刪除標點符號,然後輸出到另一個文件。 這裏的另一個主要功能:
int main(void) {
FILE* fp = fopen("book.txt", "r");
FILE* fout = fopen("newbook.txt", "w");
char* str = (char *)malloc(sizeof(char) * 1024);
if (str == NULL) {
perror("Error -- allocating memory");
exit(1);
}
memset(str, 0, sizeof(char) * 1024);
while(1) {
if (fscanf(fp, "%s", str) != 1)
break;
remove_punc(&str);
fprintf(fout, "%s ", str);
}
return 0;
}
當我在Visual C重新運行該程序++,它報告 Debug Error! DAMAGE: after Normal Block(#54)0x00550B08
, 和中止程序。
所以,我必須調試代碼。一切正常,直到執行free(nstr)
陳述。 我感到困惑。任何人都可以幫助我?
'strlen'不包含終止符,因此使用* no *標點符號發送字符串到該函數將保證一個覆蓋錯誤,調用未定義的行爲,並且如果您'重新*幸運*,崩潰你的過程。 – WhozCraig 2014-10-02 05:03:00
對原始文本進行復制並將其寫入新文件並不是那麼有效,最好是從原始文本中讀取,然後將字符寫入char,然後跳過任何標點符號。這樣你可以節省內存分配。 – 2014-10-02 05:49:11
我需要閱讀一個詞,並從該詞中刪除標點符號,然後統計該書中的詞。 – wintr 2014-10-02 06:08:11