2011-05-19 198 views
2

我有一個字符數組,形式爲mm/dd/yy(因爲用戶被要求輸入日期)。將字符數組轉換爲整數

如何分割陣列,並刪除/的,並把mmddyy到3點不同的整數?

+0

'strtol(3)'可能是最好的功能。 – sarnold 2011-05-19 01:40:39

回答

5

我會用的sscanf解析字符串:

int m, d, y;  
sscanf("05/18/11", "%02d/%02d/%02d", &m, &d, &y); 

這將解析日期爲三個整數值。

另外,要驗證輸入數據是否格式正確,還應該檢查sscanf是否返回3,表示所有三個值都已正確解析。請參閱以下working example,其中包括一些基本的錯誤檢查。

+0

我就是這麼做的。 +1 – Swift 2011-05-19 01:47:09

+1

您應該在鏈接代碼中包含錯誤檢查。 – 2011-05-19 01:50:20

+0

@Fred:添加了一些關於錯誤檢查的進一步說明。 – 2011-05-19 01:58:23

0

查看產生的標記上的strtokatoi

您也可以使用sscanf,但標記化爲輸入格式提供了更多的靈活性。

+0

請不要使用atoi解析用戶輸入。它無法檢測錯誤。 – 2011-05-19 01:53:01

0
#include <stdlib.h> 
#include <string.h> 

int main() 
{ 
    int month, day, year; 
    char mystr[10] = "05/18/11"; 
    month = atoi(strtok(mystr, "/")); 
    day = atoi(strtok(NULL, "/")); 
    year = atoi(strtok(NULL, "/")); 
    return 0; 
} 

strtok()是一個函數,它首先調用一個字符串和一個分隔符來分割。在第一次調用之後,如果您將NULL作爲第一個參數傳遞,它將繼續標記相同的字符串。 atoi將字符串轉換爲整數。

如果您的輸入非常嚴格,sscanf是好的。

+0

請不要使用atoi解析用戶輸入。它無法檢測錯誤。 – 2011-05-19 01:51:56

-1

首先,找到最近的'/'

int i; 
char *d = date; 
for(i = 0; date[i] != '/'; ++i); 

然後申請一個 「子」:

strncpy(dd, date, i); 

重複此過程:

d = date + i + 1; 
for(; date[i] != '/'; ++i); 
strncpy(mm, d, i - (d - date)); 

然後簡單地從過去的'/'去到字符串的末尾:

d = date + i + 1; 
strncpy(yy, d, strlen(date) - i); 
+0

OP問題的格式是'/'。如果它是\,那麼你將不得不使用'\\'。 \符號在C字符串中有特殊的含義。 – Lundin 2011-05-19 06:36:33

+0

@downvoters我知道我有點晚了,但謹慎解釋downvote? (除了效率低於上述答案 - 我是一名C++程序員。) – 2011-07-21 05:21:43