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