給定一個包含字母和數字的字符串,要求統計出這個字符串中從0
到9
的數字的個數。字符串僅包含英文字母與阿拉伯數字,長度1<=len(nums)<=1000
。
實例輸入:a11472o5t6
輸出:0 2 1 0 1 1 1 1 0 0
這裏數字1出現了兩次,記爲2,而2 4 5 6 7各出現一次,記爲1,剩下的0 3 8 9都沒有出現,記爲0。
在C語言中,對於char
類型的變量c
表示的數字字符,能夠經過進行運算c-'0'
來獲得其所對應的數字值,這是由於C中字符型的數值運算事實上被隱式轉換爲了int
型。編程
int main() { int* nums = (int*) malloc(10 * sizeof(int)); char c; for(int i = 0; i < 10; i++) *(nums+i) = 0; while(scanf("%c", &c) == 1) if(c >= '0' && c <= '9') (*(nums+(c-'0')))++; for(int i = 0; i < 10; i++) printf("%d ", *(nums+i)); free(nums); return 0; }
經過malloc得到一個十位的全0列表,同時經過scanf
來逐一獲取字符串中的字符,並經過ascii碼值比較判斷是否爲數字,,同時將對應位的數字加一。最後則是一個輸出過程。固然,因爲使用了malloc,因此不能忘記使用free釋放這些內存空間。
另外值得一提的是因爲free
函數僅銷燬已經再也不須要的內存空間而不對指針作變化,咱們剩下的指針將仍然存在直到程序結束,但卻指向了垃圾內存,爲了不調用這些指針發生沒必要要的錯誤,在實際編程中咱們可能須要主動將該指針指向NULL
。
其實這個有個malloc
部分咱們徹底能夠用數組代替。甚至有人使用數組直接一次性讀入字符串的方法。數組
char str[1001]; scanf("%s", str); int lut[10] = {0, }; for (int i = 0; i < strlen(str); ++i) { if (str[i] >= '0' && str[i] <= '9') { ++lut[str[i] - '0']; } } for (int i = 0; i < 10; ++i) { printf("%d ", lut[i]); }
題目說明了字符串最長有1000位,這裏使用str[1001]
,別忘了字符串最後須要一位存放\0
來表示字符串結尾。這段代碼相比前者可讀性提升了一點。函數