给定一个包含字母和数字的字符串,要求统计出这个字符串中从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
来表示字符串结尾。这段代码相比前者可读性提高了一点。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。