簡體   English   中英

c 中的字符指針數組

[英]an array of char pointers in c

我想使用一個字符指針數組,其中數組中的每個指針都指向另一個字符數組中的一個字符,因此,我可以通過指針打印字符數組。

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是一個指針數組; 它絕對不僅僅是一個字符串。

由於它不是字符串,因此您的第二個問題沒有實際意義。

你的循環條件不正確; 你需要寫:

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]

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每個元素charPointers指向一個城市名稱),那么正確的代碼如下:

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

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

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 是一個指針數組還是一個字符串?

它是一個指針數組。

什么是實現我想要的優雅方式?

沒有優雅的方法可以“使用一個字符指針數組,其中數組中的每個指針都指向另一個字符數組中的一個字符”。 這是一種混淆,除了讓你的代碼變慢和不可讀之外沒有任何意義。

理智、優雅的代碼看起來像這樣:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM