我试图遍历我的链表并将每个节点字段组合成一个字符串,然后将字符串添加到字符串数组中。
void listToArray(){ //create array of strings char *list[numNodes]; int i = 0, n; while(head != NULL){ // add string to array printf("[%d] %s %s:%dn ", i, head->fileName, head->ip, head->port); n = sprintf(list[i], "[%d] %s %s:%dn", i, head->fileName, head->ip, head->port); head = head->next; printf("%sn", list[i]); i++; }
printf语句工作正常,这表明它不是导致问题的节点字段,但是当我执行我的sprintf语句将字符串复制到数组的索引中时。 我遇到了分段错误。
你只申报
char *list[numNodes];
但不为他们分配内存。 在使用list[i]
之前使用malloc
分配内存。 要知道sprintf
生成的字符串的大小,请使用snprintf
。 感谢user3121023找到我们这个function。
void listToArray(){ //create array of strings char *list[numNodes]; int i = 0, n; while(head != NULL){ printf("[%d] %s %s:%dn ", i, head->fileName, head->ip, head->port); n = snprintf(NULL, 0, "[%d] %s %s:%dn", i, head->fileName, head->ip, head->port); list[i] = malloc((n+1)*sizeof(char)); n = sprintf(list[i], "[%d] %s %s:%dn", i, head->fileName, head->ip, head->port); head = head->next; printf("%sn", list[i]); i++; }
您没有初始化char指针数组 – sprintf正在将数据写入某个随机位置。
在调用sprintf之前,应将每个char指针初始化为具有malloc的缓冲区。
list已定义,但每个元素中都没有/ random指针。 以上答案已经完成,但可以简化一下:
void listToArray(){ //create array of strings char *list[numNodes]; char buf[5000]; int i = 0, n; while (head != NULL) { snprintf(buf,sizeof(buf),"[%d] %s %s:%dn ", i,head->fileName,head->ip,head->port); // add string to array list[i] = strdup(buf); // output fputs(list[i],stdout); head = head->next; i++; } }
你只需要做一个printf / sprintf。 那是缓慢的部分。 执行单个snprintf和strdup比执行2-3 * printf调用更快更简单。 我猜你每个项目只需要一个输出行,其余的用于调试。
以上就是c/c++开发分享无法将字符串复制到C中的字符串数组相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/544713.html