我有一个*char
的全局变量。我的主函数头读为int main(int argc, char* argv[argc]){...}
。这两行代码必须保持原样。我的main函数的第一个参数是一些*char
类型,我使用atoi(...);
转换为char。我基本上将ASCII值更改为相应的字符。现在我想将这个局部变量字符存储到作为char指针的全局变量中。我知道这个问题与内存分配有关,但我不知道如何解决这个问题。
我的代码:
char* delim;
int main(int argc, char* argv[argc])
{
char delimCharacter;
if (isdigit(*(argv[3])) == 0) delim = argv[3]; //you can pass in a character or its ascii value
else { //if the argument is a number, then the ascii value is taken
delimCharacter = atoi((argv[3]));
printf("%s\t,%c,\n", argv[3], delimCharacter);
//sprintf( delim, "%c", delimCharacter ); // a failed attempt to do this
*delim = delimCharacter;
//strncpy(delim, delimCharacter, 1); // another failed attempt to do this
}
//printf("%s\n",delim);
这会产生seg错误。
答案 0 :(得分:1)
在开始使用它们之前,你需要验证你有(至少)3个参数。
if (argc < 4)
{
printf("Need 3 args");
exit(1);
}
然后你需要分配一些内存来放置角色。
delim = malloc(2);
// TODO: Should check the result of malloc before using it.
*delim = delimCharacter;
delim[1] = 0; // Need to NULL terminate char*
答案 1 :(得分:0)
您正在取消引用未初始化的指针。 delim
进入else
区块时,{{1}}永远不会被初始化。
答案 2 :(得分:0)
char delim[] = ","; // anything really, as long as as it's one character string
...
delim[0] = delimCharacter;
答案 3 :(得分:0)
除了你的记忆问题,我认为你对atoi
的作用感到困惑。它解析数字的字符串表示并返回等效的int值,例如“10000”=&gt; 10,000。我认为你认为它会给你一个字符的ASCII值,例如“A”=&gt; 65。
由于你有一个char *
,并且你(我认为)假设它包含一个字符,你可以这样做:
delimCharacter = *(argv[3]);
但是,似乎根本没有必要使用将此值分配给char
变量的中间步骤。如果最终目标是让delim
指向作为分隔符的char,那么这就是你需要做的所有事情:
delim = argv[3];
这不仅会删除不必要的代码,而且意味着您不再需要为delim指定额外的内存来指向。
我还要将delim声明为const char *
因为我认为没有理由改变它。