2016-03-23 62 views
-2

这是我的代码。 findMin()函数中的语句int value = atoi(ptr [index])给出了一个错误,如截图所示。c atoi()函数不起作用

enter image description here

奇怪的是,当我使用相同的atoi()函数在主,一切工作相当不错,但它在findMin尖叫!

CODE: 
void* findMin(void *param); 

int main(int argc, char *argv[]) 
{ 

    pthread_t t2; //for min 
    num=argc; 

    /*int index=1; THIS WORKS 
    int value=atoi(argv[index]);*/ 

    //creating worker thread 
    pthread_create(&t1,NULL,findMin,argv); 

    pthread_join(t2,NULL); //wait for min 
    printf("The minimum value is %d\n",min); 


    return 0; 
} 

void* findMin(void *param) 
{ 
    char *ptr=(char *) param; //casting 
    int index=1; 
    min=ptr[1]; 
    for(index; index<num; index++) 
    { 
     int value=atoi(ptr[index]); //THIS SCREAMS LIKE HELL! 
     if(comp<min) min=value; 

    } 
} 
+1

你需要atoi(ptr)或atoi(ptr +索引); – Claris

+0

@Claris,我认为OP正试图将单个字符转换为整数,'ptr + index'将转换字符串的其余部分 –

+3

不要发布文本图像! – Olaf

回答

3

看的atoi签名:

int atoi(const char *); 

函数需要的参数是类型char *的。您通过ptr[index],这是char类型。
简单的解决办法是使用局部变量:

char digit[2] = ""; 

然后将第一个字符的值要处理:

digit[0] = ptr[index]; 
int value = atoi(digit); 

因为digit是类型char[]的,它在将它传递给函数时会衰减为指针


但是这样会很麻烦。有一个更简单的方法。 C标准要求数字字符是连续的,因此常见的伎俩,以数字字符转换为它们的整数值被写这篇文章:

int value = ptr[index] - '0'; 

这工作,因为在ASCII例如,'0'数值是48 ,'1'是49,2是50等等。因此,如果你有一个这样的字符串:

"1234" 

,你遍历每个字符,减去每'0',你会得到:

49 - 48 = 1 
50 - 48 = 2 
51 - 48 = 3 
52 - 48 = 4 

基本上做你想要/需要

什么

挂在

我只注意到你实际上遍历argv。您的铸造不正确!

char *ptr=(char *) param; 

实际上应该是:

char **ptr = param; 

由于argvchar **(指向指针)。

你也做一些奇怪的事情在这里:

如果你实际上试图做的是比较分别通过了所有的参数,并选择从他们的最低数量,那么这就是你应该写什么:

char **ptr= param; //no need for cast, void * is compatible with char ** 
int i = 1; 
min = atoi(ptr[1]);//assuming min is int, because you're assigning value to it later on 
for(i; i<num; ++i) 
{ 
    int value = atoi(ptr[i]); 
    if(value < min)//replaced comp with value, because I can't see the comp variable anywhere 
     min = value; 
} 
+0

@chux:更改为双引号,我提到_“C标准要求数字字符是连续的_”,然后我继续使用ASCII值作为示例。不需要轰炸有关各种字符集的信息,如EBCDIC :) –