Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从所有数组元素打印字符串_C_Arrays_String_Pointers_Char - Fatal编程技术网

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

C 从所有数组元素打印字符串,c,arrays,string,pointers,char,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){ sprint

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

下面的代码出现分段错误

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


有人知道好方法吗?

简短且唯一的答案是:您需要告诉打印函数数组中有多少项

如何做并不重要,无论是作为参数,还是作为终止符在数组中添加额外的项,例如
NULL
指针(很像字符串本身由
'\0'
字符终止)。此时,您的打印函数很可能会超出您传入的数组的边界



您的代码还存在其他问题,比如没有为
elm
myStr
分配内存。而且
ret
变量是非常无用的。

简短且唯一的答案是:您需要告诉打印函数数组中有多少项

#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;
}
如何做并不重要,无论是作为参数,还是作为终止符在数组中添加额外的项,例如
NULL
指针(很像字符串本身由
'\0'
字符终止)。此时,您的打印函数很可能会超出您传入的数组的边界



您的代码还存在其他问题,比如没有为
elm
myStr
分配内存。而且
ret
变量是非常无用的。

简短且唯一的答案是:您需要告诉打印函数数组中有多少项

#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;
}
如何做并不重要,无论是作为参数,还是作为终止符在数组中添加额外的项,例如
NULL
指针(很像字符串本身由
'\0'
字符终止)。此时,您的打印函数很可能会超出您传入的数组的边界



您的代码还存在其他问题,比如没有为
elm
myStr
分配内存。而且
ret
变量是非常无用的。

简短且唯一的答案是:您需要告诉打印函数数组中有多少项

#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;
}
如何做并不重要,无论是作为参数,还是作为终止符在数组中添加额外的项,例如
NULL
指针(很像字符串本身由
'\0'
字符终止)。此时,您的打印函数很可能会超出您传入的数组的边界


您的代码还存在其他问题,比如没有为
elm
myStr
分配内存。而且
ret
变量非常无用。

\include
#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;
}
#包括 #包括 字符*打印数组(字符**s){ inti,n; 大小\u t大小=0; char*ret; 对于(i=0;s&&s[i];++i) 尺寸+=strlen(s[i]); n=i;//字符串的数目, 如果(ret=malloc(大小+2+(n-1)*(n>0)+n*2+1)){//sumoflen(s)+[]+''+'+'+'+'\0' 内伦; char*p=ret; *p++='['; 对于(i=0;i
#包括
#包括
#包括
字符*打印数组(字符**s){
inti,n;
大小\u t大小=0;
char*ret;
对于(i=0;s&&s[i];++i)
尺寸+=strlen(s[i]);
n=i;//字符串的数目,
如果(ret=malloc(大小+2+(n-1)*(n>0)+n*2+1)){//sumoflen(s)+[]+''+'+'+'+'\0'
内伦;
char*p=ret;
*p++='[';
对于(i=0;i
#包括
#包括
#包括
字符*打印数组(字符**s){
inti,n;
大小\u t大小=0;
char*ret;
对于(i=0;s&&s[i];++i)
尺寸+=strlen(s[i]);
n=i;//字符串的数目,
如果(ret=malloc(大小+2+(n-1)*(n>0)+n*2+1)){//sumoflen(s)+[]+''+'+'+'+'\0'
内伦;
char*p=ret;
*p++='[';
对于(i=0;i
#包括
#包括
#包括
字符*打印数组(字符**s){
inti,n;
大小\u t大小=0;
char*ret;
对于(i=0;s&&s[i];++i)
尺寸+=strlen(s[i]);
n=i;//字符串的数目,
如果(ret=malloc(大小+2+(n-1)*(n>0)+n*2+1)){//sumoflen(s)+[]+''+'+'+'+'\0'
内伦;
char*p=ret;
*p++='[';
对于(i=0;i