給定一個包含字母和數字的字符串,要求統計出這個字符串中從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
來表示字符串結尾。這段代碼相比前者可讀性提高了一點。