我的C-Strings数组声明为:
char *argv[MAXARGS];
MAXARGS基本上只是告诉我们有多少c字符串在数组中用于索引目的。 我想将它传递给下面的函数...
int builtin_cmd(char **argv)
但似乎没有任何事情可以通过,我这样调用了这个函数。
char *argv[MAXARGS];
builtin_cmd(argv);
但是一旦我进入函数builtin_cmd
并尝试使用
printf("%s\n", argv[0]);
它什么都没打印....但是当我在调用函数之前这样做...
char *argv[MAXARGS];
printf("%s\n", argv[0]);
//builtin_cmd(argv);
它将打印c字符串数组中的第一个C字符串就好了。 我的想法是,我正在顺利通过这个结构,我想知道将它传递给函数的正确方法。
编辑:
int builtin_cmd(char **argv);
int main()
{
char *argv[128];
//put 'quit' into argv[0]..
printf("%s\n", argv[0]); //prints 'quit'
builtin_cmd(argv);
}
int builtin_cmd(char **argv)
{
printf("%s\n", argv[0]); //prints nothing
}
问题是,我似乎无法将argv引入该函数。它也可以编译,没有任何错误或警告。
答案 0 :(得分:1)
您尚未展示如何初始化阵列,这是至关重要的部分。
#include <stdio.h>
static void builtin_cmd(char **argv)
{
while (*argv != NULL)
printf("%s\n", *argv++);
}
int main(void)
{
char *argv[] = { "abc", "def", "ghi", NULL };
builtin_cmd(argv);
return 0;
}
此代码使用sentinel值(空指针)来标记数据的结尾。另一种方法是将数组中的字符串数作为单独的参数传递。当您使用int main(int argc, char **argv)
时,实际上您正在使用这两种机制; argv[argc] == NULL
所以有计数然后是哨兵价值。
答案 1 :(得分:1)
您正在尝试将一个字符指针数组传递给函数,因此您的函数声明应为builtin_cmd(char* argv[])
。这是一个将指针数组传递给函数的示例示例
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void fill_strings(char *str[], int nstrings)
{
int i;
for ( i=0; i < nstrings; i++)
strcpy(str[i], "hello world");
}
void print_strings(char *str[], int nstrings)
{
int i;
for (i=0; i < nstrings; i++)
printf("string %d: %s\n", i, str[i]);
}
int main(void)
{
char *index[10];
int i;
for(i=0; i<10; i++)
{
index[i] = malloc(20);
}
fill_strings(index, 10);
print_strings(index, 10);
return 0;
}
答案 2 :(得分:0)
如果您在命令行上传递输入,则需要告诉编译器您正在使用从运行时传递到main的参数。
int main(int argc, char **argv)
{
这应该允许你正确地传递“quit”作为第一个参数。否则,正如其他人所说,你如何填写“C矢量”很重要。