输入的动态内存分配?

时间:2014-02-18 20:35:27

标签: c memory-management scanf dynamic-memory-allocation argc

我在启动项目时遇到了很多麻烦。以下是方向:

"Complete counts.c as follows:
    Read characters from standard input until EOF (the end-of-file mark) is read. Do not prompt the user to enter text - just read data as soon as the program starts.
    Keep a running count of each different character encountered in the input, and keep count of the total number of characters input (excluding EOF)."

我教授给我的格式是:`

#include <stdio.h>
int main(int argc, char *argv[]) {
return 0;
}

除了如何启动问题之外,我还很困惑为什么在没有任何内容传递给main函数时为什么会给出这两个参数。帮助会很有意义!谢谢!

`

3 个答案:

答案 0 :(得分:2)

看到你在这里遇到麻烦有点棘手。标题不是一个完整的问题,身体中也没有;他们似乎在暗示完全不同的问题。

作业告诉你阅读字符 - 而不是存储它们。如果你愿意,你可以有一个循环只能一次读取它们(例如,使用getchar)。您还被要求报告每个字符的计数,这对于存储在数组中是有意义的。鉴于这是“每个不同的字符”,最简单的方法是为所有可能的字符调整数组的大小(limits.h定义UCHAR_MAX,这将有助于此)。如果数组被自动分配(函数局部变量的默认值),请记住初始化数组。

关于main的参数,这个程序不需要它们,而C标准确实允许你将它们排除在外。它们可能包含在内,因为它是基本C程序的模板,如果还将使用命令行参数,则可以使用它们。

有关更多参考代码,您可能需要比较单词计数实用程序(wc);您想要的字符数是频率分析或直方图的基础。

答案 1 :(得分:0)

这可以让您开始研究完成任务所需的知识,

最初声明一个足够大小的字符输入缓冲区来读取字符,

char input[SIZE];

使用fgets()从stdin中读取字符,

if (fgets(input, sizeof input, stdin) == NULL) {
     ;  // handle EOF
}

现在input数组包含您要查找字符的字符串。我不明白当你说不同的字符要计数时,你有一个数组来完全遍历它来计算你需要的字符。

答案 2 :(得分:0)

首先,幸运的是,我们在这里根本不需要动态内存分配,因为我们没有被要求存储输入字符串,而是我们只需要记录在程序运行期间输入的每个ascii代码的数量,因为我们可以简单地将它们存储在固定大小的数组中的常量和有限数量。

我们在这里看到的函数(假设我们使用的是标准库)如下:

  • getchar,从标准输入中读取字符
  • printf,将输出打印回stdout

我们需要的结构是:

  • do {} while,循环直到条件为假

其余的只需要简单的数学运算符,这里有一个简短的例子,基本上显示了一个示例解决方案:

#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(),但是如果你选择添加命令行选项并且没有性能优势,这会使事情变得更加困难。