【问题标题】:How to declare a char array of size same as the size of the string entered at the runtime in C?如何声明一个大小与在 C 中运行时输入的字符串大小相同的 char 数组?
【发布时间】:2014-04-03 03:16:12
【问题描述】:

我想从用户那里得到一个字符串,在一个没有固定长度的 char 数组中。长度应等于用户输入的字符串的长度。我尝试了 malloc(),但这也需要指定大小。请帮忙。 请标记一下,我要使用char数组,不是字符串类型。

【问题讨论】:

  • 你要等它输入,看看它有多长。您仍然可以将使用的任何内容视为数组,只是您不能像这样指定长度:[27].
  • 你能告诉我怎么做吗?

标签: c arrays string


【解决方案1】:

C 字符串不包含它们的长度。每个 C 字符串都是一个简单的字符数组,最后一个字符后面有一个 null 表示它的结束。因此,C IO 库中的标准函数通常会接收一个字符数组并将数据写入其中。该数组必须足够大以容纳用户键入的所有内容。大多数函数甚至不会检查缓冲区溢出。

现在您可以做的是首先询问用户将要输入的字符串的最大长度并分配确切的内存,或者您可以声明一个巨大的数组并将其大小定义为最大字符串长度。

char bigBuffer[2048];
fgets(bigBuffer, 2048, stdin);

fgets() 允许您指定输入的最大字符数。如果用户输入的字符数超过 2048 个,在本例中,fgets() 将返回错误并防止您的程序崩溃。

【讨论】:

    【解决方案2】:

    不可能分配无限长的内存。每个内存都以某种方式受到大小的限制。

    有两种方法可以处理您的情况。
    1.分配一个不会超出任何可能的用户输入的大内存。
    2. [更好的选择] 使用合理大小的内存,并使用 fgets 之类的长度检查函数来获取用户输入。

    【讨论】:

      【解决方案3】:

      您需要的是基本的无限制输入功能。这个想法是为输入分配一个合理大小的缓冲区,一次开始读取一个char,如果缓冲区大小超过realloc,则增加它的大小。

      您可以通过读取剩余空间长度的字符串来稍微优化一下,但这会变得复杂而繁琐。主要是不值得。

      我在头脑中编写了这段代码,因此它可能无法按原样编译和工作,但它应该为您提供基本概念。

      char *buffer = malloc(100);
      size_t bufferLen = 100;    
      size_t currLen = 0;
      int c;
      while ((c = getchar()) != EOF && c != '\n')
      {
          if (currLen > bufferLen-1) // -1 because must leave room for null terminator
          {
              bufferLen += 100;
              buffer = realloc(buffer, bufferLen);
              buffer[currLen++] = c;
          }
          else
              buffer[currLen++] = c;
      }
      buffer[currLen] = '\0';
      

      【讨论】:

        【解决方案4】:

        这可以通过间接方式完成。

        从输入中一次读取一个字符。使用malloc/realloc 以递增方式分配内存。它不是恒定顺序时间和恒定顺序内存算法,但可以实现您的功能。 这是代码 sn-p。

        char ch;
        int count=0;
        char *charArray=NULL;
        printf("Enter string\n");
        while((ch=getchar())!='\n')//This condition can be changed according to needs
        {
            count=count+1;
            charArray=(char *)realloc(charArray,count);
            charArray[count-1]=ch;
        }
        

        【讨论】:

          【解决方案5】:

          在用户输入字符串后创建数组。不记得确切的 C 语法,但类似于

          string word = "";
          scanf("%s", word");
          char myArray[word.length];
          

          【讨论】:

          • C 中恐怕没有string 类型。
          • 我说,我不想用字符串类型。
          • 'string' 是标准模板库的 C++ 类:STL。它不能与 scanf() 或 C 中的任何格式函数一起使用。
          猜你喜欢
          • 2020-10-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-02-01
          相关资源
          最近更新 更多