给定一个包含字母和数字的字符串,要求统计出这个字符串中从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来表示字符串结尾。这段代码相比前者可读性提高了一点。