【问题标题】:Strcat adding "blank space" to arrayStrcat将“空白”添加到数组
【发布时间】: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 谢谢你,我改变了一些东西并使用不同的方法修复了它,感谢反馈!

标签: c string char concatenation


【解决方案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;

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-28
    • 2017-05-26
    • 2020-02-12
    • 2016-01-02
    • 2012-12-11
    • 1970-01-01
    • 2011-04-26
    • 2016-12-31
    相关资源
    最近更新 更多