簡體   English   中英

C - 字符連接到字符串

[英]C - character concatenate to string

我有以下簡單的程序,逐字符讀取文本文件。 每次從文件中讀取一個字符時,必須在作為字符串的str的末尾。 出於這個原因,我創建了一個名為conc的小函數,它接受字符,重新分配str ,然后將字符放在字符串的末尾( str [count] = ch )。
在EOF字符之后,我將'\\ 0'字符作為字符串變量的結尾放在str中。 我的問題是為什么最后一個printf顯示垃圾? 有任何想法嗎?? 提前致謝。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void conc(char* str,char ch,int* count);

int main(int argc,char** argv)
{
   char* str = (char*)malloc(sizeof(char));
   char ch;
   int count = 0,i;
   FILE* fp = fopen("path","r");

   if(fp == NULL){
       printf("No File Found");
       return 1;
   }

   ch=fgetc(fp);
   while(ch!=EOF){
       conc(str,ch,&count);
       ch=fgetc(fp);
   }

   str[count] = '\0';
   printf("%s",str);

   free(str);

   return(0);
}

void conc(char* str,char ch,int* count){
    str[*count] = ch;
    (*count)++;
    //printf("\n%c",str[(*count)-1]);
    str = (char*)realloc(str,(*count)+1);
}

問題在於你如何realloc()指針。 您對str所做的更改不會修改main()的原始指針。 您只是在conc()指定指針str的副本。 您需要將指針傳遞給指針才能對其進行修改。

void conc(char** str,char ch,int* count){
    (*str)[*count] = ch;
    (*count)++;
    *str = realloc(*str,(*count)+1);
}

並從main()傳遞指向它的指針:

conc(&str,ch,&count);

更改原型以匹配:

void conc(char** str,char ch,int* count);

其他人指出:

1)當realloc()失敗時,它返回NULL,你將丟失原始指針。 所以你需要使用臨時文件並分配給原文。 請參閱: 動態分配數組可以更改其大小嗎?

2) 轉換malloc() / realloc()等也很危險。

3)始終檢查malloc()等的返回值,以查看內存分配是否失敗。

3)一次分配一個字符不是很有效。 典型的方法是在realloc()時分配大小為N的緩沖區並加倍大小。

沒有必要將count傳遞給你的函數,因為你(或者更確切地說,應該)傳遞一個正確的零終止字符串,並且新字符應該總是添加到它的結尾。

如果你要修改str ,那么從str = NULL開始稍微好一些。 在第一次調用時,將str設置為占用2個字節開始,並在每次下一次調用時添加1個字符。

小心char ch; 然后使用while(ch!=EOF) .. 這僅在簽名默認char時有效。 當您在輸入中遇到字節0FFh時,它也會過早停止。

考慮到這些要點,我最終得到了這樣的結論:

char *conc (char *str, char ch);

int main (void)
{
   char *str = NULL;
   int ch;

   FILE* fp = fopen("path","r");

   if(fp == NULL){
       printf("No File Found");
       return 1;
   }

   ch=fgetc(fp);
   while(ch!=EOF)
   {
       str = conc (str, ch);
       ch = fgetc(fp);
   }

   printf("%s",str);

   free(str);

   return 0;
}

char *conc (char *str, char ch)
{
    int last_pos;
    if (str)
    {
        last_pos = strlen(str);
        str = realloc (str, last_pos+1);
    } else
    {
        str = malloc(2);
        last_pos = 0;
    }
    str[last_pos] = ch;
    str[last_pos+1] = 0;
    return str;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM