我试图将数组中的所有元素打印为字符串。
以下代码会出现分段错误。
因为char的某些指针没有指向正确的地址。
char *print_array(char **s) {
int i;
char *ret;
char *elm;
char *myStr;
strcat(myStr,"[");
for (i = 0; s && s[i]; ++i){
sprintf(elm,"\"%s\" ",s[i]);
strcat(myStr,elm);
}
strcat(myStr,"]");
ret = myStr;
return ret;
}
int main(){
char *myArray[10] = {"4", "2", "11", "4", "15", "7", "9", "12", "3", "6"};;
printf("## %s",print_array(myArray));
}
然后,我如何从数组中的所有元素打印字符串?
我的意思是上面的例子使用10个数组元素,但我想要打印任何数组,这些数组从不知道每个元素的元素和长度。
有谁知道好方法?
答案 0 :(得分:2)
简短而唯一的答案是:您需要告诉打印功能阵列中有多少项。
如何这样做无关紧要,无论是作为参数,还是在数组中添加一个额外的项目作为终结符,例如:一个NULL
指针(非常类似于字符串本身由'\0'
字符终止)。目前,您的打印功能很可能会超出您传入的阵列范围。
您的代码还存在其他问题,例如您没有为elm
和myStr
分配内存。 ret
变量非常无用。
答案 1 :(得分:1)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *print_array(char **s) {
int i, n;
size_t size =0;
char *ret;
for(i=0; s && s[i]; ++i)
size += strlen(s[i]);
n = i;//number of strings,
if(ret = malloc(size + 2 + (n-1)*(n>0) + n*2 + 1)){//sumoflen(s) + [] + ' ' + "" + '\0'
int len;
char *p = ret;
*p++ = '[';
for (i = 0; i < n; ++i){
len = sprintf(p, "\"%s\"", s[i]);
p += len;
if(i < n-1)
*p++ = ' ';
}
*p++ = ']';
*p = '\0';
}
return ret;
}
int main(){
char *myArray[] = {"4", "2", "11", "4", "15", "7", "9", "12", "3", "6", NULL};//last : Sentinel
char *p;
printf("## %s", p=print_array(myArray));
free(p);
return 0;
}