在char指针中存储char

时间:2010-07-30 16:07:17

标签: pointers ascii segmentation-fault character allocation

我有一个*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错误。

4 个答案:

答案 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 *因为我认为没有理由改变它。