2010-07-30 45 views
0

我有一个全局变量,即*char。我的主要功能标题为int main(int argc, char* argv[argc]){...}。这两行代码必须保持原样。我的主要功能的第一个参数是一些*char类型,我转换为字符使用atoi(...);。我基本上将ASCII值更改为相应的字符。现在我想将这个局部变量字符存储到全局变量中,该变量是一个字符指针。我知道这个问题与内存分配有关,但我不知道如何去解决这个问题。在字符指针中存储字符

我的代码:

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); 

这产生了赛格故障。

+1

为什么不是:int main(int argc,char ** argv) – karlphillip 2010-07-30 16:08:41

回答

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* 
0

你访问一个未初始化的指针。 delim在进入else块时从不初始化。

0
char delim[] = ","; // anything really, as long as as it's one character string 

... 


delim[0] = delimCharacter; 
0

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

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

delimCharacter = *(argv[3]); 

然而,似乎真的没有必要使用根据中间步骤将该值分配给变量char。如果最终的目标是有delim点是分隔符的字符的话,好像这是所有你需要做的:

delim = argv[3]; 

这不仅消除不必要的代码,但它意味着你将不再需要为delim分配额外的内存来指向。

我也会声明delim为const char *,因为我认为没有理由改变它。