C 从所有数组元素打印字符串
我尝试将数组中的所有元素打印为字符串 下面的代码出现分段错误 因为char的某些指针没有指向正确的地址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 *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