0

我有一个全局变量,它是*char. 我的主要功能标题为int main(int argc, char* argv[argc]){...}. 这两行代码必须保持原样。我的 main 函数的第一个参数是一些类型*char,我使用它转换为 char atoi(...);。我基本上是将 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);

这会产生一个段错误。

4

4 回答 4

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*
于 2010-07-30T16:14:03.370 回答
0

您正在取消引用未初始化的指针。 delim当它进入else块时永远不会被初始化。

于 2010-07-30T16:14:32.720 回答
0
char delim[] = ","; // anything really, as long as as it's one character string

...


delim[0] = delimCharacter;
于 2010-07-30T16:15:09.720 回答
0

除了您的记忆问题之外,我认为您对做什么感到困惑atoi。它解析数字的字符串表示并返回等效的 int 值,例如“10000” => 10,000。我认为您认为它会给您一个字符的 ASCII 值,例如“A”=>65。

既然你有一个char *, 并且你(我认为)假设它包含一个字符,你可以简单地这样做:

delimCharacter = *(argv[3]);

但是,似乎根本不需要使用将这个值分配给char变量的中间步骤。如果最终目标是delim指向作为分隔符的字符,那么您似乎只需要这样做:

delim = argv[3];

这不仅删除了不必要的代码,而且意味着您不再需要为 delim 分配额外的内存来指向。

我还将 delim 声明为 a,const char *因为我认为没有理由更改它。

于 2010-07-30T16:23:56.553 回答