2013-04-24 50 views
1

我有一個數組input,它可能包含一個數字。我知道它將出現在陣列中的哪裏(如果它出現):在:之後。 (未來的輸入可能包含多個數字,每個數字後面有一些文字和一個:)。將c樣式字符串的一部分轉換爲int

我能夠創建一個新陣列,然後從input複製到我的令牌開始的新陣列,繼續閱讀字符0-9。然後我在新陣列上撥打atoi

如果我能說atoi(array, start, end),它只會轉換包含我的數字的數組部分,並且不需要複製到新數組循環,這會稍微簡單一些。

我看不到任何這樣的atoi function超載。

是否有一種簡單的方法將c樣式字符串的一部分轉換爲不涉及我自己編寫的數字atoi(const char * str, int start, int end)

+2

在C中沒有'overloading' ...... – 2013-04-24 11:30:27

+1

你可以用'strtol':返回指向第一個非 - 數字字符。 – 2013-04-24 11:36:18

回答

2

使用strtoul通過D.Shawley的建議,你可以做到以下幾點:

代碼

char* str = ":12 sdfsdf :45:18"; 
char* p = str; 
while (*p) 
{ 
    if (*p++ == ':') 
     printf("%d\n", strtoul(p, &p, 10)); 
} 

輸出

12 
45 
18 

See the codepad

的atoi版本

也有可能使用的atoi(codepad):

char* str = ":12 sdfsdf :45:18"; 
char* p = str; 
while (*p) 
{ 
    if (*p++ == ':') 
     printf("%d\n", atoi(p)); 
} 
3

改爲使用strtoul。只需使用索引調整或偏移起始地址即可。輸出指針會讓你知道解析結束的地方。

0

不,我不知道這樣的功能。

也有在C.

沒有超載

然而,編寫自己的atoi並不難。

int atoi_se(const char * str, int start, int end) { 
    char* startPtr = str+start; 
    char* endPtr = str+end; 
    char savedChr = *endPtr; 
    *endPtr = '\0'; 
    int retVal = strtol(startPtr, NULL, 10); 
    *endPtr = savedChr; 
    return retVal; 
} 

注:我跳過了這種功能所需的防禦性編碼。

0

atoi應該可以正常工作。只需將它傳遞給開始位置(而不是整個input數組),它將讀取儘可能多的數字。數字後面的其他字符將被忽略。