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, &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将“空白”添加到数组的主要内容,如果未能解决你的问题,请参考以下文章