【问题标题】:C Dynamic Array based on input from console基于控制台输入的 C 动态数组
【发布时间】:2011-08-29 00:11:44
【问题描述】:

我正在编写一个程序来存储来自控制台的输入。为了简化,假设我需要将写入的内容输出到控制台。

所以我有这样的事情:

int main()
{
  char* input;
  printf("Please write a bunch of stuff"); // More or less.
  fgets() // Stores the input to the console in the input char*

  printf(input);
}

所以或多或少就是这样。只是想给你一个大致的想法。那么,如果他们输入大小为 999999999999 的内容怎么办。我怎样才能动态地将 char* 分配为该大小。

【问题讨论】:

  • 发布实际代码而不是无效的代码(输入变量没有后备内存)会是一个更好的主意...
  • 为您所处理的内容设置合理的最大值,否则将其视为错误。
  • 有一些限制,比如控制台实际接受的长度。只需分配字符串的长度并确保分配没有失败

标签: c arrays io char


【解决方案1】:
#include <stdio.h>

int main(void)
{
    char input[8192];
    printf("Please type a bunch of stuff: ");
    if (fgets(input, sizeof(input), fp) != 0)
        printf("%s", input);
    return(0);
}

这允许相当大的空间。您可以检查数据中是否确实有换行符。

如果这还不够,请研究 POSIX 2008 函数 getline(),它在 Linux 中可用,它会根据需要动态分配内存。

【讨论】:

    【解决方案2】:

    这是一个示例 - 您需要验证输入并确保不会溢出缓冲区。在此示例中,我丢弃了超过最大长度的任何内容并指示用户重试。另一种方法是在发生这种情况时分配一个新的(更大的)缓冲区。

    fgets() 第二个参数是您将从输入中读取的最大字符数。我实际上在这个例子中考虑了\n 并摆脱它,你可能不想这样做。

    #include <stdio.h>
    #include <string.h>
    
    void getInput(char *question, char *inputBuffer, int bufferLength)
    {
        printf("%s  (Max %d characters)\n", question, bufferLength - 1);
        fgets(inputBuffer, bufferLength, stdin);
    
        if (inputBuffer[strlen(inputBuffer) -1] != '\n')
        {
            int dropped = 0;
            while (fgetc(stdin) != '\n')
                    dropped++;
    
            if (dropped > 0) // if they input exactly (bufferLength - 1) characters, there's only the \n to chop off
            {
                    printf("Woah there partner, your input was over the limit by %d characters, try again!\n", dropped );
                    getInput(question, inputBuffer, bufferLength);
            }
        }
        else
        {
            inputBuffer[strlen(inputBuffer) -1] = '\0';      
        }
    
    }
    
    
    int main()
    {
        char inputBuffer[10];
        getInput("Go ahead and enter some stuff:", inputBuffer, 10);
        printf("Okay, I got: %s\n",inputBuffer);
        return(0);
    }
    

    【讨论】:

      猜你喜欢
      • 2021-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多