首先,幸运的是,我们在这里根本不需要动态内存分配,因为我们不需要存储输入字符串,相反,我们只需要记录在程序运行期间输入的每个 ascii 代码的数量,因为有一个常数和有限我们可以简单地将它们存储在一个固定大小的数组中。
我们在这里查看的函数(假设我们使用标准库)如下:
我们需要的结构是:
其余的只需要简单的数学运算符,这是一个简短的示例,它基本上显示了一个示例解决方案:
#include <stdio.h>
int main(int argc, char *argv[])
{
/* Create an array with entries for each char,
* then init it to zeros */
int AsciiCounts[256] = {0};
int ReadChar;
int TotalChars = 0;
int Iterator = 0;
do
{
/* Read a char from stdin */
ReadChar = getchar();
/* Increment the entry for its code in the array */
AsciiCounts[ReadChar]++;
TotalChars++;
} while (ReadChar != EOF);
/* Stop if we read an EOF */
do
{
/* Print each char code and how many times it occurred */
printf("Char code %#x occurred %d times\n", Iterator, AsciiCounts[Iterator]);
Iterator++;
} while (Iterator <= 255);
/* Print the total length read in */
printf("Total chars read (excluding EOF): %d", --TotalChars);
return 0;
}
这应该实现基本目标,但是一些扩展练习可能有助于您对 C 的理解。首先,您可以尝试将第二个 do while 循环转换为 for 循环,这更适合这种情况,但我没有使用为了简单起见。其次,您可以添加一个条件,以便输出阶段跳过从未发生过的代码。最后,检查哪些字符是可打印的并打印它们的值而不是它们的十六进制代码可能会很有趣。
在问题的第二部分,即使它们被忽略,这些参数也传递给 main 的原因是由于大多数操作系统下 c 程序的标准调用约定,它们传递命令行参数的数量和每个命令行参数的值分别在程序希望检查它们的情况下。但是,如果您真的不使用它们,您可以在大多数编译器中只使用 main() 代替,但是如果您选择添加命令行选项并且没有性能优势,这会使以后的事情变得更加困难。