【问题标题】:an array of char pointers in cc中的char指针数组
【发布时间】:2014-04-25 13:41:23
【问题描述】:

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

【问题讨论】:

  • 你想做什么? charPointers 是一个指针数组;它不是一个字符串。你问题的第二部分没有实际意义。你问“什么是实现我想要的优雅的方式”而不解释你想要什么。
  • 我已经在一开始就说明了我想要的代码。我想要一个 char 指针数组来指向 city[14] 数组中的每个字符。
  • 如果你真的想要 14 个字符的指针,你需要运行循环设置指针 14 次,而不仅仅是 5 次。但是,除此之外,您的指针初始化代码有效;您最终会得到一个指向 city 字符串中每个非空指针的指针。正如我在回答中诊断的那样,您的打印循环的终止条件有缺陷。你真的应该展示或描述你得到的输出。您可能会得到城市名称,然后是垃圾,最终导致崩溃,但如果您这么说会更好。我的回答显示了如何以合理的方式解决问题。你还想要什么?

标签: c arrays pointers


【解决方案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]

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

      charPointers 显然是一个指向字符的指针数组。数组city 是一个字符串(正如评论中指出的那样),因为您指定的长度为 14,但只提供了 5 个实际字符。其余的设置为零,这将终止字符串。

      获得相同结果的更清晰的方法是:

      const char *city = "Dubai";
      

      您对*charPointers 的循环很奇怪,因为它将*charPointers 视为一个字符,而实际上它是一个指针。

      也许你的意思是:

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

      【讨论】:

      • 其实已经正常终止了;如果大括号括起来的初始化程序没有为所有元素包含足够的初始化程序,则其他元素被初始化为零。
      • 我明白了。那么如何使用 charPointers 指向 char 数组 city[14] 中的每个字符,从而允许我通过 charPointers 逐字符打印城市?!?!
      • @JonathanLeffler 大脑错误。我重写了它。我永远不会依赖这样的初始化来创建一个字符串,它太晦涩了。
      • 公平地说,我认为 OP null 是靠运气而不是故意终止它的……乍一看,这对我来说也是一个明显的错误。
      【解决方案4】:

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

      为什么?在现实世界的编程中,您永远没有理由想要这样做。

      因此,我可以通过指针打印 char 数组

      确实如此。如果您的程序太快且太有效,这将非常方便。

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

      这是一个指针数组。

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

      没有优雅的方式来“使用 char 指针数组,其中数组中的每个指针都指向另一个 char 数组中的 char”。这是一种混淆,除了使您的代码变慢且不可读之外,它没有任何意义。

      理智、优雅的代码如下所示:

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

      【讨论】:

        猜你喜欢
        • 2021-01-26
        • 2012-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-14
        • 2018-09-26
        • 2023-03-17
        • 1970-01-01
        相关资源
        最近更新 更多