c atoi()函数不起作用

时间:2016-03-23 17:21:48

标签: c debugging atoi

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

enter image description here

奇怪的是,当我在main中使用相同的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 个答案:

答案 0 :(得分:3)

查看atoi的签名:

int atoi(const char *);

该函数要求参数为char *类型。您正在传递ptr[index] char,其类型为char digit[2] = ""; 简单的解决方案是使用局部变量:

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

然后将第一个字符设置为您要处理的值:

digit

因为char[]属于int value = ptr[index] - '0'; 类型,它会在将函数传递给函数时衰减为指针

但那会很混乱。有一种更简单的方法。 C标准要求数字字符是顺序的,因此将数字字符转换为整数值的常见技巧是写下:

'0'

这是有效的,因为在ASCII中,'1'的数值为48,"1234" 为49,2为50,依此类推。因此,如果您有这样的字符串:

'0'

你迭代每个角色,从每个角色中减去49 - 48 = 1 50 - 48 = 2 51 - 48 = 3 52 - 48 = 4 ,你会得到:

argv

基本上做你想要/需要的事情

挂起

我刚注意到你实际上正在迭代char *ptr=(char *) param; 。您的演员不正确!

char **ptr = param;

实际应该是:

argv

因为char **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; } (指向指针的指针)。

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

如果您真正想要做的是比较所有传递的参数并从中选择最小的数字,那么这就是您应该写的:

m <- matrix(as.numeric(lung.X), nrow = 86, ncol = 7129)