无法将字符串复制到 C 中的字符串数组
Can't copy string to an array of strings in C
我正在尝试遍历我的链表并将每个节点字段组合成一个字符串,然后将该字符串添加到一个字符串数组中。
void listToArray(){
//create array of strings
char *list[numNodes];
int i = 0, n;
while(head != NULL){
// add string to array
printf("[%d] %s %s:%d\n ", i, head->fileName, head->ip, head->port);
n = sprintf(list[i], "[%d] %s %s:%d\n", i, head->fileName, head->ip, head->port);
head = head->next;
printf("%s\n", list[i]);
i++;
}
printf 语句工作正常,这表明不是节点的字段导致了问题,而是当我执行 sprintf 语句将字符串复制到数组的索引时。我遇到分段错误。
您没有初始化 char 指针数组 -- sprintf 正在将数据写入某个随机位置。
在调用 sprintf 之前,应使用 malloc 将每个 char 指针初始化为缓冲区。
你只声明
char *list[numNodes];
但不为它们分配内存。在使用 list[i]
之前使用 malloc
分配内存。要知道从 sprintf
生成的字符串的大小,请使用 snprintf
。感谢 user3121023 为我们找到这个功能。
void listToArray(){
//create array of strings
char *list[numNodes];
int i = 0, n;
while(head != NULL){
printf("[%d] %s %s:%d\n ", i, head->fileName, head->ip, head->port);
n = snprintf(NULL, 0, "[%d] %s %s:%d\n", i, head->fileName, head->ip, head->port);
list[i] = malloc((n+1)*sizeof(char));
n = sprintf(list[i], "[%d] %s %s:%d\n", i, head->fileName, head->ip, head->port);
head = head->next;
printf("%s\n", list[i]);
i++;
}
列表已定义,但每个元素中都有 no/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:%d\n ",
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 调用更快更简单。我猜你每个项目只需要一个输出行,其余的用于调试。
我正在尝试遍历我的链表并将每个节点字段组合成一个字符串,然后将该字符串添加到一个字符串数组中。
void listToArray(){
//create array of strings
char *list[numNodes];
int i = 0, n;
while(head != NULL){
// add string to array
printf("[%d] %s %s:%d\n ", i, head->fileName, head->ip, head->port);
n = sprintf(list[i], "[%d] %s %s:%d\n", i, head->fileName, head->ip, head->port);
head = head->next;
printf("%s\n", list[i]);
i++;
}
printf 语句工作正常,这表明不是节点的字段导致了问题,而是当我执行 sprintf 语句将字符串复制到数组的索引时。我遇到分段错误。
您没有初始化 char 指针数组 -- sprintf 正在将数据写入某个随机位置。
在调用 sprintf 之前,应使用 malloc 将每个 char 指针初始化为缓冲区。
你只声明
char *list[numNodes];
但不为它们分配内存。在使用 list[i]
之前使用 malloc
分配内存。要知道从 sprintf
生成的字符串的大小,请使用 snprintf
。感谢 user3121023 为我们找到这个功能。
void listToArray(){
//create array of strings
char *list[numNodes];
int i = 0, n;
while(head != NULL){
printf("[%d] %s %s:%d\n ", i, head->fileName, head->ip, head->port);
n = snprintf(NULL, 0, "[%d] %s %s:%d\n", i, head->fileName, head->ip, head->port);
list[i] = malloc((n+1)*sizeof(char));
n = sprintf(list[i], "[%d] %s %s:%d\n", i, head->fileName, head->ip, head->port);
head = head->next;
printf("%s\n", list[i]);
i++;
}
列表已定义,但每个元素中都有 no/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:%d\n ",
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 调用更快更简单。我猜你每个项目只需要一个输出行,其余的用于调试。