我对我的计划有疑问
#include<stdio.h>
int myFunc(char **);
main()
{
char *a[2]={"Do","While"};
myFunc(a);
}
int myFunc(char **P)
{
/* Here I want to print the strings passed but I'm unable to
print the strings I just tried the below statement which
printed just the first letter which is 'D'*/
printf("%c",**P);
}
当我尝试
时printf("%s",**P);
我遇到了运行时错误。那么有人可以帮帮我吗?
由于 马杜
答案 0 :(得分:11)
将size作为参数,以允许函数知道数组中有多少个字符串。然后,您应该迭代数组并打印每个数组。
int myFunc( char** p, int size)
{
for( int i = 0; i < size; ++i)
{
printf("%s", p[i]);
}
}
稍后编辑(根据要求:-))
int main( int, char**)
{
char *a[2]={"Do","While"};
myFunc( a, 2); // Could be myFunc( a, sizeof(a)/sizeof(char*));
// ...
return 0;
}
答案 1 :(得分:8)
太多的星星 - 试试
printf("%s",*P);
您需要%s
格式说明符 - %c
仅适用于单个字符。
如果要打印所有字符串,则需要在数组中传递字符串数,然后从循环中打印这些字符串。
检查CătălinPitiş建议的代码。要传递字符串数,可以调用以下函数:
myFunc(a, sizeof(a)/sizeof(a[0]));
答案 2 :(得分:5)
for( int i = 0; i < 2; i++ ) {
char* string = P[i];
printf( "%s", string );
}
你应该使用某种方法将数组大小传递给函数 - 或者将它作为int参数传递,
int myFunc(char **P, int size)
{
for( int i = 0; i < size; i++ ) {
//whatever here
}
}
或者总是向数组附加一个零值,并且只有在找到零值时才循环。
char* array[] = { "String1", "String2", 0 };
否则你将很难维护代码。
答案 3 :(得分:4)
我喜欢objective-c样式的nil(0)终止数组:
void myFunc(char **P)
{
while (*P) // loop to iterate over all strings until 0
printf("%s\n",*P++); // print and move to next element in array
}
int main()
{
char *a[]={"Do","While",0}; // added 0 to null terminate array,
myFunc(a); // kind of like string
}
输出:
Do
While
答案 4 :(得分:1)
首先,好消息:a
的类型等同于char **
,因此您将有效参数传递给myFunc()
。
第一个问题是%c
是格式说明符,表示打印单个字符。由于**P
是一个计算单个字符的表达式,因此您的第一个版本完全按照您的要求执行。那不是你想要的。
第二个版本接近语法正确。它应该是printf("%s", *P)
,其中*P
是一个表达式,它求值为指向以空字符结尾的ASCII字符串的指针。在这种情况下,它评估为“Do”。此版本不会打印两个字符串。
虽然数组的名称与指向其第一个元素的指针相同,但这是一种“骗子”。将数组传递给函数不会也无法传达数组的长度。要做到这一点,你需要一个包含长度的第二个参数,或者像字符串上的nul-terminator这样的约定来指示数组的结尾。通过该更改,您可以修改myFunc()
以对传递的元素使用循环并打印每个元素。
答案 5 :(得分:1)
你的代码中的问题是你想要打印一个字符串(char *),但你给它一个字符。请记住,P是char *的数组。当你取消引用它一次,你得到一个char *;当你第二次这样做时,你只需要在char *的开头得到char。
当您尝试将char值与%s说明符一起使用时,它会将该值视为指针,并尝试取消引用该值。因此,它将尝试在存储器位置X处打印“字符串”,其中X是字符的值(即,从0到255的值)。这会给您一个访问冲突/分段错误(您在运行时看到的错误)。
Cătălin Pitiș和RBerteig指出的最佳解决方法是:
答案 6 :(得分:1)
如果您不想保留并传递数组大小::
int myFunc(char **);
main()
{
char *a[2]={"Do","While", NULL};
myFunc(a);
}
int myFunc(char **P)
{
if( !P )
return 0;
while(*P != NULL)
{
printf("%s",*P);
P++;
}
}
答案 7 :(得分:0)
错误答案:我认为你打印它时可能不得不取消引用,尽管我可能错了。
编辑:我很累,现在凌晨3点,但我不想睡觉,所以我在这里试图回答问题。在阅读批评之后,我重新阅读了这个问题,并注意到他确实取消了P,但正如另一个答案所述,它被解除引用太多了。当想要打印char字符串时,想要传递指针,因为char字符串实际上是一个数组。另一个编辑:我还想指出,在我回答后,提出问题的人进行了编辑,当我第一次回答它时,没有读到“printf(”%s“,** P); “它读作“printf(”%s“,P);”最后一部分是大胆的。