2014-09-12 101 views
1

我正在學習如何爲char數組賦值,並且我需要執行一個操作,將一個數字和字符串拆分爲不同的變量並將其打印出來。我相信我很接近,但在打印出應該是我的號碼時,我會得到瘋狂的數字。這是int的地址嗎?任何意見是極大的讚賞!我的代碼和輸入/輸出:strtok和int vs char char C

#include <stdio.h> 

    int main() { 
     setbuf(stdout, NULL); 
     char name[10]; 
     printf("Enter in this format, integer:name\n"); 
     fgets(name, 10, stdin);       //my input was 2:brandon 
     char *n = strtok(name, ":"); 
     int num = (int)n; 
     char * order = strtok(NULL, ":"); 
     printf("%d,%s", num,order);      //my output was 7846332,brandon 
     return (0); 
    } 

回答

3

這條線是不正確的:

int num = (int)n; 

這是地址爲int?

不,這是在您的整數的字符表示存儲位置,重新解釋爲int(即它可能是一個截斷地址的字符緩衝區的地址,使得它幾乎無意義數)。

您可以將通過解析值,或使用atoi它來詮釋之一:

int num = atoi(n); 

Demo.

+0

一般'與strtol()'比'atoi將更好的選擇()'因爲與strtol更靈活,並且atoi對錯誤報告不屑一顧。 – 2014-09-12 13:35:33

+0

甜,我現在得到它,非常感謝! – Branbron 2014-09-12 13:52:54

+0

@John Hascall同意'strtol()'比'atoi()'更好,因爲它具有良好的錯誤處理能力。但是,這可能涉及諸如'errno = 0; char * endptr; long tmp = strtol(n,&endptr,10); if(endptr == n)Handle_NoConversion(); if(errno || tmp INT_MAX)Handle_Overflow(); n =(int)tmp;' – chux 2014-09-12 15:18:08

3

如果您提供"123:foobar"作爲輸入,指針n指向字符串"123"。當您將指針轉換爲整數時,整數的值是變量n的值,它是由strtok返回的字符串所在的內存中位置的地址。

如果您想將包含數字的字符串轉換爲實際的數字,您應該使用例如該strtol功能:

int num = strtol(n, NULL, 10);