Strcat将“空白”添加到数组

Posted

技术标签:

【中文标题】Strcat将“空白”添加到数组【英文标题】:Strcat adding "blank space" to array 【发布时间】:2021-12-31 05:19:46 【问题描述】:

我有一个从文件中读取包名及其目录的函数。我已经设置了一个变量来在另一个之前捕获一个项目(它们用逗号分隔)。当我附加到我的字符串时,它似乎添加它就好了。但是,当我重新分配字符串(将其压缩到实际大小)时,它拥有的字符会保留一半。

当我使用 for 循环来测试它时,每个字符之间都会投射出空字符。所以我有一个测试工作“duck”,当我将它打印为字符串时,它会写成“duck”但是如果它迭代它,它会变成“d”“”“u”“”“c”

while(1)


    char c = fgetc(db);
    actual_file_size++;

    if(c == EOF)
    
        //pkg_install_dir = realloc(pkg_install_dir, (sizeof(pkg_install_dir) + 2));
        //printf("The install dir is: %s\n", pkg_install_dir);
        break;
    

    if(is_pkg_name) 
        printf("Chracter being added to pkg_name: %c\n", c);
        strcat(pkg_name, &c);
     else 
        strcat(pkg_install_dir, &c);
    
    

    if(c == ',')
    
        printf("Actual file size int is: %d\n", actual_file_size);
        printf("Package name before realloc: %s\n", pkg_name);

        for(int i = 0; i < 5; i++)
        
            printf("%c\n", pkg_name[i]);
        

        pkg_name = realloc(pkg_name, actual_file_size);
        is_pkg_name = 0;
        actual_file_size = 0;
        printf("The string is:%s\n", pkg_name);
    
    

终端输出:

【问题讨论】:

strcat(pkg_name, &amp;c); 这是错误的,因为strcat 要求两个参数都是字符串。单个字符不是字符串,结果是未定义的行为。 @kaylum 谢谢你,我改变了一些东西并使用不同的方法修复了它,感谢反馈! 【参考方案1】:

感谢 kaylum 和这篇文章:How to get char* with unknown length in C?

我能够通过删除该函数并在 while 循环中使用 realloc 来解决我的问题,请参见下文,我希望它在未来对其他人有所帮助!

pkg_name 和 pkg_install_dir 仍在使用 char 缓冲区,因为我意识到使用文章中的 realloc 方式,两个内存点会相互滚动(很长一段时间来弄清楚这一点,我再也回不来了!) .

学习 C 很有趣!

int read_db()

FILE *db;

db = fopen("/tmp/devpkg/db/db", "r");

char *pkg_name = malloc(MAX_CHAR_BUFF);
char *pkg_install_dir = malloc(MAX_CHAR_BUFF);
int is_pkg_name = 1;
int actual_file_size = 0;
while(1)


    char c = fgetc(db);
    if(c == EOF)
    
        pkg_install_dir = realloc(pkg_install_dir, (actual_file_size - 1));
        pkg_install_dir[actual_file_size - 1] = '\0';
        break; // while loop will finish here
    

    if(is_pkg_name) 
        pkg_name[actual_file_size] = c;
     else 
        pkg_install_dir[actual_file_size] = c;
    

    actual_file_size++;
    
    if(c == ',')
    
        pkg_name = realloc(pkg_name, (actual_file_size - 1));
        pkg_name[actual_file_size - 1] = '\0';

        is_pkg_name = 0;
        actual_file_size = 0;
        printf("The string is:%s\n", pkg_name);
    

    
    


fclose(db);

free(pkg_name);
free(pkg_install_dir);

return 0;

【讨论】:

以上是关于Strcat将“空白”添加到数组的主要内容,如果未能解决你的问题,请参考以下文章

为啥将项目添加到空白数组中会重复显示项目?

strcat 与 c 中的数组中的字符

使用 char 数组的 strcat 函数

Mongoose 为啥要添加空白数组?

matlab中strcat用法,速求

对象数组打印空白字符串