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

时间:2014-08-16 03:35:37

标签: c pointers

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

4 个答案:

答案 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;
}