Hello如何打印从2d数组传递到名为print_2d的函数的字符串 在该函数中,我正在捕获以字符串作为其元素
的2d数组的基址现在有了指向数组的指针现在我想用指向数组的指针打印字符串? 我的代码在下面
#include<stdio.h>
void print_2d(char (*p)[10],int r) // i am catching with pointer to an array
{
int i;
for(i=0;i<r;i++)
printf("%s",*p[i]); //segmentation fault why?
// how to print then?
}
main()
{
char *s[10]={"one","two","three","four"};
int r;
r=sizeof(s)/sizeof(s[0]);
print_2d(s,r);
}
答案 0 :(得分:2)
试试这个
#include<stdio.h>
void print_2d(char *p[10],int r) // This is another change.
{
int i;
for(i=0;i<r;i++)
printf("%s",p[i]); // This is the main change
}
int main() // main has to return int
{
char *s[10]={"one","two","three","four"};
int r;
r=sizeof(s)/sizeof(s[0]);
print_2d(s,r)
}
s[0]
,s[1]
等是字符串。你为什么要打印*s[0]
,*s[1]
等?
答案 1 :(得分:2)
您的print_2d
函数被声明为接受指向char[10]
数组的指针。但是,在您的代码中没有任何地方有char[10]
数组。您的代码中可以合法地传递给print_2d
。
无论如何,无法修复&#34;你的代码,直到你解释你想要做什么为止。
根据print_2d
的正文和main
中的内容判断,您可能需要以下内容
void print_2d(char *(*p)[10],int r)
{
int i;
for (i = 0; i < r; i++)
printf("%s", (*p)[i]);
}
int main()
{
char *s[10] = { "one", "two", "three", "four" };
int r;
r = sizeof(s) / sizeof(s[0]);
print_2d(&s, r);
}
请注意,参数p
被声明为指向char *
指针数组的指针,这就是s
中的main
。但是,您必须意识到指向数组的指针只能指向固定的预定大小的数组。传递给print_2d
的数组总是大小为10而且只有10.因此,将数组大小分别传递给print_2d
是没有意义的。只需计算内部的大小并摆脱第二个参数
void print_2d(char *(*p)[10])
{
int i, r;
r = sizeof *p / sizeof **p;
for (i = 0; i < r; i++)
printf("%s", (*p)[i]);
}
int main()
{
char *s[10] = { "one", "two", "three", "four" };
print_2d(&s);
}
或者,您的代码可以修复,如@ BLUEPIXY的回答所示,但这是解释您的意图的完全不同的方式。而且我们不知道你的意图是什么。
答案 2 :(得分:1)
您遇到的问题每次都是r = 10
。因此,当您传递print_2d(s,r)
时,您告诉print_2d
有10个字符串要打印。您无法使用r
获取sizeof (arr)/sizeof(arr[0])
,每次都会返回10
。您已经使用赋值和初始化创建了一个指向10 character arrays
的指针(默认情况下,null将终止4个给定的字符串,并将6个空为空)。要防止出现段错误,您需要将字符数组的数量传递给print_2d
。例如:
#include<stdio.h>
void print_2d(char **p, int r) // i am catching with pointer to an array
{
int i;
for (i=0; i<r; i++)
printf ("%s\n", p[i]);
}
int main (void)
{
char *s[10] = {"one","two","three","four"};
int r;
// r = sizeof(s)/sizeof(s[0]); // r = 10 causing segfault @ i = 4 in print_2d
// you cannot get the number of string arrays in this manner.
r = 4;
printf("r: %d\n", r);
print_2d (s,r);
return 0;
}
<强>输出:强>
$ ./bin/par
r: 4
one
two
three
four
如果您想使用sizeof (s) / sizeof (s[0])
,则需要按以下方式声明s
:
char *s[] = {"one","two","three","four"};
int r;
r = sizeof(s)/sizeof(s[0]); // Now r will equal 4
答案 3 :(得分:1)
char (*p)[10]
是char[10]
的指针,而不是char *s[10]
(指向char
的10的数组)
如果main
是正确的,则需要更改void print_2d(char (*p)[10], int r)
。
#include <stdio.h>
void print_2d(char (*p)[10], int r){
int i;
for(i=0;i<r;i++)
printf("%s\n", p[i]);
}
int main(){
char s[][10]={"one","two","three","four"};
int r;
r=sizeof(s)/sizeof(s[0]);
print_2d(s,r);
return 0;
}