将字符指针数组传递给函数

9
我试图将一个已初始化的char指针数组传递给一个函数。我似乎无法弄清楚为什么该函数只会打印出数组中每个元素的数字字符。
有人知道如何从传入的指针数组中打印每个字符串元素吗?
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>

void sort(char *);

int main()
{
   char *states[4] = {"Florida", "Oregon", "California", "Georgia"};

   sort(*states);

   return 0;
}

void sort(char *states)
{
   int x;

   for (x = 0; x < 4; x++) {
      printf("\nState: %d\n", states[x]); //only this will compile
      //printf("\nState: %s\n", states[x]); //need to print this.
   }

}

你将一个指向 Florida 的指针传递给函数,然后打印出与该字符串的前四个字母对应的数字。这不是你想要的吗? - Jonathan Leffler
2
sort(states); 排序(states);void sort(char *states[]) 空类型 排序(字符型指针 states[]) - Rabbid76
好的,我明白了。所以我没有接受指针数组。 - Andrew Hummel
5个回答

13

如果您想打印数组的内容,sort函数必须接受指针数组。

void sort (char *states[], size_t num_states) {
    int x;

    for (x = 0; x < num_states; ++x) {
        printf("\nState: %s\n", states[x]); /* Note %s instead of %d */
    }
}

同时,你必须将数组传递给该函数。

sort(states, 4);

1
“sort”函数必须接受指向指针的指针。最终,“char *states[]”与“char **states”作为函数参数是等效的,因此“char *states[]”不是指针数组。 - haccks
1
@haccks:你是正确的。调用者的参数是一个数组的名称,而sort函数必须有一个原型,允许传递该参数。数组名称会退化为指针值,等于其第一个元素的地址,因此sort需要接受一个指向char *的指针。 - jxh
那么在主函数中的字符数组指针始终只是最初指向该数组中的第一个元素,对吗? - Andrew Hummel
1
@user3495404; main函数中没有char数组指针。states是一个指向char的指针数组。在函数调用sort(states, 4);中,states被转换为char **(指向数组states第一个元素的指针,即指向state[0]的指针)。 - haccks

3
你需要解析一个指向char的指针数组来进行排序(而不仅仅是char指针)。
正如jhx所指出的,你还需要传递数组的大小。你可以使用sizeof,以避免硬编码4。在初始化时也省略数组大小。
void sort( char *states[], int arr_size )
{
    int x;

    for (x = 0; x < arr_size; x++) 
    {
        printf( "\nState: %s\n", states[x] );
    }
}

int main()
{
    char *states[] = {"Florida", "Oregon", "California", "Georgia"};     // array of pointers to char

    sort( states, sizeof( states ) / sizeof( char * ) );

    return 0;
}

你能解释一下sizeof(states) / sizeof(char *)的作用吗? - Andrew Hummel
1
states 是一个指向字符指针的数组。char * 是一个指向字符的指针。因此,这个除法指定了 states 指针数组中元素的数量(即字符指针的数量)。 - artm

1
你需要将字符指针数组传递给函数:
   #include <stdio.h>
    #include <string.h>
    #include <ctype.h>
    #include <stdlib.h>

    void sort(char *args[], int n);

    int main()
    {
       char *states[4] = {"Florida", "Oregon", "California", "Georgia"};

       sort(states, 4);

       return 0;
    }

    void sort(char *states[], const int N)
    {
       int x;

       for (x = 0; x < N; x++) {
          printf("\nState: %s\n", states[x]); 
       }

    }

1
你只收到数字值的原因是你只传递了数组 states 中字符串 states[0] 的第一个元素的指针,即你传递了 &states[0][0]。因此,该语句...
printf("\nState: %d\n", states[x]);  

只会打印字符串 "Florida" 的前 4 个字符的数字值。

你需要传递数组 states 的第一个元素的指针,即 &states[0]
这可以通过更改函数 sort 的声明来实现。

void sort(char **, size_t size); // You need to pass the size of array too. 

并将其称为

sort(states, sizeof(states)/sizeof(char *));

0
你正在发送一个指针数组 states,因此你需要将该数组的基地址发送到函数。
sort(*states);

然后只以指针数组的形式接收它

void sort(char* states[])
{
   int x;

   for (x = 0; x < 4; x++) {
      printf("\nState: %s\n", states[x]);
   }

}

硬编码大小也不是一个好主意,所以最好在函数调用中添加另一个参数size

sort(states, sizeof(states)/sizeof(char*));

然后使用它来迭代数组

void sort(char* states[], int size)
{
   int x;

   for (x = 0; x < size; x++) {
      printf("\nState: %s\n", states[x]);
   }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接