从所有数组元素打印字符串

时间:2014-04-18 11:24:00

标签: c arrays string pointers char

我试图将数组中的所有元素打印为字符串。

以下代码会出现分段错误。

因为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个数组元素,但我想要打印任何数组,这些数组从不知道每个元素的元素和长度。

有谁知道好方法?

2 个答案:

答案 0 :(得分:2)

简短而唯一的答案是:您需要告诉打印功能阵列中有多少项。

如何这样做无关紧要,无论是作为参数,还是在数组中添加一个额外的项目作为终结符,例如:一个NULL指针(非常类似于字符串本身由'\0'字符终止)。目前,您的打印功能很可能会超出您传入的阵列范围。


您的代码还存在其他问题,例如您没有为elmmyStr分配内存。 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;
}