2016-03-23 105 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 :) –