c中的一个char指针数组

时间:2014-04-25 13:41:23

标签: c arrays pointers

我想使用一个char指针数组,其中数组中的每个指针指向另一个char数组中的char,因此,我可以通过指针打印char数组。

char city[14] = {'D', 'u', 'b', 'a', 'i'};
char *charPointers[100] = {0};
for(size_t i = 0;city[i] != '\0'; i++)
    charPointers[i] = &city[i];
printf("\ncity = ");
for(size_t i = 0; *charPointers != 0; i++)
    //printf("%c", *(charPointers[i]));
    putchar(*charPointers[i]);

charPointers是一个指针数组还是一个字符串? 如果它是一个字符串,那么我如何使用一个指针数组,使每个指针指向一个字符串? 什么是实现我想要的优雅方式? (最好使用指针算法)

4 个答案:

答案 0 :(得分:1)

charPointers是一个指针数组;它绝对不仅仅是一个字符串。

由于它不是一个字符串,你的第二个问题没有实际意义。

您的循环条件不正确;你需要写:

for (size_t i = 0; charPointers[i] != 0; i++)
    //printf("%c", *(charPointers[i]));
    putchar(*charPointers[i]);
putchar('\n');

您正在测试第一个指针是否为空;它不是。您需要在每次迭代时检查当前指针。下面的循环可能会帮助您了解正在发生的事情:

for (size_t i = 0; charPointers[i] != 0; i++)
    printf("%zd [%s]\n", i, charPointers[i]);

此代码:

#include <stdio.h>

int main(void)
{
    char city[14] = {'D', 'u', 'b', 'a', 'i'};
    char *charPointers[100] = {0};
    for(size_t i = 0;city[i] != '\0'; i++)
        charPointers[i] = &city[i];

    printf("city = ");

    for (size_t i = 0; charPointers[i] != 0; i++)
        putchar(*charPointers[i]);
    putchar('\n');

    for (size_t i = 0; charPointers[i] != 0; i++)
        printf("%zd [%s]\n", i, charPointers[i]);

    return 0;
}

生成此输出:

city = Dubai
0 [Dubai]
1 [ubai]
2 [bai]
3 [ai]
4 [i]

答案 1 :(得分:1)

charPointer是指向char的指针数组。指向char数组的指针为char (*p)[100];

您的代码接近正确,这是非分段版本:

char city[14] = {'D', 'u', 'b', 'a', 'i', '\0'};
char* charPointers[100] = {0};
size_t i =0;
for(i = 0; city[i] != '\0'; i++)
    charPointers[i] = city + i;

charPointers[i] = city + i; // Don't forget to add the \0 at the end !

printf("\ncity = ");
for(i = 0; *charPointers[i] != '\0'; i++)
    printf("%c", *charPointers[i]);

我真的不知道你想做什么,但上面的代码是在city的每个元素中存储指向字符串charPointers的每个字符的指针。

但是,如果要在charPointers中存储指向现有字符串的指针(例如,charPointers的每个元素指向一个城市名称),这里的代码是正确的:

char* cityNames[NB_CITY];
char* city = "Dubai";

cityNames[0] = city;
printf("%s\n", cityNames[0]); // gives "Dubai"

答案 2 :(得分:0)

charPointers显然是一个指向字符的数组。数组city是一个字符串(在注释中指出),因为您已指定长度为14但仅提供了5个实际字符。其余的都设置为零,这将终止字符串。

获得相同结果的更明确的方法是:

const char *city = "Dubai";

你的*charPointers循环很奇怪,因为它将*charPointers视为一个角色,当它真的是一个指针时。

也许你的意思是:

for(size_t i = 0; charPointers[i] != NULL; ++i)
  printf("%s\n", charPointers[i]);

答案 3 :(得分:0)

  

我想使用一个char指针数组,其中数组中的每个指针指向另一个char数组中的char

为什么呢?在现实世界的编程中,你从来没有理由想要这样做。

  

因此,我可以通过指针

打印char数组

事实上。如果您的程序太快且太有效,那就太方便了。

  

charPointers是一个指针数组还是一个字符串?

它是一个指针数组。

  

什么是实现我想要的优雅方式?

没有优雅的方法来使用一个char指针数组,其中数组中的每个指针指向另一个char数组中的char#34;。这是混淆,除了使你的代码变得缓慢且不可读之外,它没有任何用处。

Sane,优雅的代码看起来像这样:

const char city [] = {'D', 'u', 'b', 'a', 'i', '\0'}; 

printf("City = ");
print_str(city);

...

void print_str (const char* str)
{
  while(*str != '\0')
  {
    putchar(*str);
    str++;
  }
}