C 如何使用指向数组的指针打印从2d数组传递的字符串?

C 如何使用指向数组的指针打印从2d数组传递的字符串?,c,pointers,C,Pointers,您好,如何打印从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

您好,如何打印从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);
}
#包括
void print_2d(char(*p)[10],int r)//我正在用指向数组的指针捕捉
{
int i;
对于(i=0;i试试这个

#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)
}
#包括
void print_2d(char*p[10],int r)//这是另一个变化。
{
int i;
对于(i=0;i试试这个

#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)
}
#包括
void print_2d(char*p[10],int r)//这是另一个变化。
{
int i;

对于(i=0;i您每次遇到的问题是
r=10
。因此,当您通过
print_2d(s,r)
时,您告诉
print_2d
有10个字符串要打印。您无法使用
sizeof(arr)/sizeof(arr[0])获得
r
每次它都将返回
10
。您已使用赋值和初始化创建了一个指向
10个字符数组的指针(默认情况下,该指针为null终止4个给定字符串,将6个字符串保留为空)。为防止出现错误,您需要将字符数组的数量传递给
print\u 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;
}
如果要使用
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

您每次遇到的问题是
r=10
。因此,当您通过
print\u 2d(s,r)
时,您告诉
print\u 2d
有10个字符串要打印。您无法使用
sizeof(arr)/sizeof(arr[0])获得
r
每次它都将返回
10
。您已使用赋值和初始化创建了一个指向
10个字符数组的指针(默认情况下,该指针为null终止4个给定字符串,将6个字符串保留为空)。为防止出现错误,您需要将字符数组的数量传递给
print\u 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;
}
如果要使用
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
char(*p)[10]
是指向
char[10]
的指针,而不是
char*s[10]
(10的指针数组指向
char

需要更改
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;
}
#包括
无效打印(字符(*p)[10],整数r){
int i;
for(i=0;i
char(*p)[10]
是指向
char[10]
的指针,而不是
char*s[10]
(10的指针数组指向
char

需要更改
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;
}
#包括
无效打印(字符(*p)[10],整数r){
int i;

对于(i=0;i您的
print\u 2d
函数声明为接受指向
char[10]
数组的指针。但是,您的代码中没有
char[10]
数组。您的代码中没有可以合法传递给
print\u 2d
的内容

无论如何,在你解释你要做什么之前,不可能“修复”你的代码

根据
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);
}

或者,您的代码可以按照@BLUEPIXY的回答进行修复,但这是一种完全不同的解释您意图的方式。我们不知道您的意图是什么。

您的
print\u 2d
函数被声明为接受指向
char[10]
数组的指针。但是,您的代码中没有
char[10]
array。您的代码中没有任何内容可以合法地传递给
print\u 2d

无论如何,在你解释你要做什么之前,不可能“修复”你的代码

根据
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);
}

或者,您的代码可以按照@BLUEPIXY的回答进行修复,但这是一种完全不同的解释您意图的方式。我们不知道您的意图是什么。

您想要指向数组的指针还是指向数组的指针?@code peedient pointer to a array(*p)[10]?但是
s
被声明为指针数组…请注意,所示代码中没有2D数组。有指针数组,但那是1D数组。您想要指向数组的指针还是指向数组的指针?@code peedient pointer指向数组(*p)[10]?但是
s
被声明为指针数组…请注意,在显示的代码中没有2D数组。有一个指针数组,但那是一个1D数组。对不起,char*p[10]是指针数组,实际上我想用指向数组(*p)[10]的指针捕捉它们,然后打印它们?@SumitKumar“主要更改”这里最重要的是。由于传递参数时会进行隐式转换,指针数组和指向数组的指针之间的差异可能无关紧要。(但是,可能还有其他问题没有解决。)@SumitKumar-from
main
您正在传递一个指针数组。因此,您应该接受一个指针数组,而不是指向数组的指针。@user93353这只是我在一次采访中被问到的问题,我必须用指向数组的指针捕捉指针数组?请您解释一下,我有没有可能说他不可能?rry char*p[10]指针数组真的是我想用指向数组的指针(*p)[10]捕捉并打印它们吗?@SumitKumar这里的“主要更改”很重要。由于传递参数时会进行隐式转换,指针数组和指向数组的指针之间的差异可能无关紧要。(但是,这个问题可能没有解决其他问题。)@SumitKumar-from
main
您正在传递一个指针数组。因此您应该