我从main调用我的函数…
int main() {
char* input[81];
char** array[81];
userInput(input);
parseInput(input);
}
userInput接收输入并存储在输入变量中。这是正确的工作。
但现在我想将输入和一个char指针数组发送到我的parseInput函数,以使用strtok 将输入解析为数组
下面是我的parseInput((函数。。。
void parseInput(char* in) {
char *tok = strtok(in, " ");
int i = 0;
while(tok != NULL) {
array[i] = tok;
tok = strtok(NULL, " ");
i++;
}
}
当我试图编译时,我收到了以下警告,我不明白为什么。
警告:从不兼容的指针类型传递"userInput"的参数1[默认情况下启用]userInput(input(;
警告:正在从不兼容的指针类型传递"parseInput"的参数1[默认情况下启用]parseInput(输入,数组(;
如有任何指导,我们将不胜感激。谢谢
您将函数parseInput
定义为接受类型为char*
的参数,但在函数main
中,您将向其传递类型为char**
的衰减参数。这就是编译器抱怨指针类型不兼容的原因。
代替
char* input[81];
你可能应该写:
char input[81];
此外,申报
char** array[81];
可能应该改为:
char* array[81];
此外,正如在注释部分中已经指出的,函数parseInput
将不会编译,因为它引用了标识符array
,但该函数看不到具有该名称的标识符。它看不到函数main
的标识符array
。因此,如果希望函数parseInput
能够访问函数main
中的array
,那么在调用parseInput
时,必须将指针传递给该数组。
代码的另一个问题是,函数parseInput
的行为没有意义,因为该函数的调用方(在本例中为main
(无法知道parseInput
写入了指针数组的多少元素。因此,它无法知道函数调用后数组中有多少元素是有效的。因此,让函数parseInput
返回一个指定写入的数组元素数的int
可能更有意义。
另一个问题是函数parseInput
只是假设传递的数组足够大。如果这个假设是错误的,那么它将导致缓冲区溢出。因此,设计函数parseInput
可能更安全,因为它还传递了一个指定传递数组大小的参数,这样函数就可以在缓冲区溢出发生之前停止。
在应用了上述所有修改后,函数parseInput
将如下所示:
int parseInput( char* in, char** results, int results_length )
{
char *tok = strtok(in, " ");
int i = 0;
while( tok != NULL && i < results_length )
{
results[i] = tok;
tok = strtok(NULL, " ");
i++;
}
return i;
}
而不是像这个那样调用函数
parseInput(input);
你现在可以这样称呼它:
int main(void)
{
char input[81] = "This is a test.";
char* array[81];
int num_elements;
num_elements = parseInput( input, array, sizeof array / sizeof *array );
for ( int i = 0; i < num_elements; i++ )
{
printf( "%sn", array[i] );
}
return 0;
}
该测试程序提供以下输出:
This
is
a
test.