【问题标题】:Confused with making an input into an empty array.对将输入放入空数组感到困惑。
【发布时间】:2023-03-31 07:30:01
【问题描述】:

假设我进行了输入: "Hello world" // 换行 “再见世界” // 第二个输入

我如何扫描这两行并将它们分别输入到两个不同的数组中。我相信我需要使用 getchar 直到它达到'\ n'。但是我如何扫描第二个输入。

提前致谢。我是 C 的初学者,所以请在没有指针的情况下这样做会很有帮助,因为我没有涵盖该主题。

【问题讨论】:

  • 使用 getchar 直到再次遇到 '\n'。
  • 阅读fgets()函数!
  • 注意:输入未确定,换行符未输入到要缓冲的输入流中。例如,输入 Hello 然后 5 次 BS-KEY 然后输入 Goodbye... 程序接收 Goodbye... ,在缓冲流中不接收 Hello 和 BS-KEY。

标签: c arrays string algorithm


【解决方案1】:

试试这个代码:

#include<stdio.h>
int main(void)
  {
   int flx=0,fly=0;
   char a,b[10][100];
   while(1)
     {
      a=getchar();
      if(a==EOF) exit(0);
      else if(a=='\n')
        {
         flx++;
         fly=0;
         } 
      else
        {
         b[flx][fly++]=a;
          }
    }
  }

这里我使用一个二维数组来存储字符串。我逐个字符地读取输入。首先我创建一个无限循环来继续读取字符。如果用户输入文件字符的末尾,则输入停止。如果有换行符,则增加 flx 变量并将下一个字符存储在下一个数组位置。您可以参考使用 b[n] 存储的字符串,其中 n 是索引。

【讨论】:

    【解决方案2】:

    您可能应该查看的函数是 fgets。至少在我的系统上,定义如下:

    char *fgets(char * restrict str, int size, FILE * restrict stream);
    

    所以一个非常简单的从键盘读取输入的程序会运行如下:

    #include <stdio.h>
    #include <stdlib.h>
    
    #define MAXSTRINGSIZE 128
    
    int main(void)
      {
        char array[2][MAXSTRINGSIZE];
        int i;
        void *result;
    
        for (i = 0; i < 2; i++)
          {
            printf("Input String %d: ", i);
            result = fgets(&array[i][0], MAXSTRINGSIZE, stdin);
            if (result == NULL) exit(1);
          }
        printf("String 1: %s\nString 2: %s\n", &array[0][0], &array[1][0]);
        exit(0);
      }
    

    这可以在我的系统上正确编译和运行。 fgets 的唯一问题是在字符串中保留换行符 \n 。因此,如果您不想这样做,则需要将其删除。至于 *FILE 参数,stdin 是一个预定义的 *FILE 结构,表示标准输入或文件描述符 0。还有用于标准输出(文件描述符 1)的 stdout 和用于错误消息和诊断的 stderr(文件描述符 2)。文件描述符编号对应于 shell 中使用的编号,如下所示:

    $$$-> cat somefile > someotherfile 2>&1

    这样做是取出文件描述符 2 的 outfile 并将其重定向到 1,然后将 1 重定向到文件。此外,我正在使用 & 运算符,因为我们正在寻址数组的一部分,并且有问题的函数(fgets、printf)需要指针。至于结果,gets 和 fgets 的手册页说明如下:

    返回值 成功完成后, fgets() 和 gets() 返回一个指向字符串的指针。如果在读取任何字符之前出现文件结束, 它们返回 NULL 并且缓冲区内容保持不变。如果 发生错误,它们返回 NULL 并且缓冲区内容为 不定。 fgets() 和 gets() 函数不区分 在文件结束和错误之间,调用者必须使用 feof(3) 和 ferror(3) 来确定发生了什么。

    因此,为了使您的代码更加健壮,如果您得到一个 NULL 结果,您需要使用 ferror 检查错误或使用 feof 检查文件结尾并做出适当的响应。此外,永远不要EVER 使用gets。您可以安全使用它的唯一方法是您必须具有预见未来的能力,显然没有人可以做到,因此无法安全使用它。它只会让你面临缓冲区溢出攻击。

    【讨论】:

      猜你喜欢
      • 2019-05-10
      • 2013-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-24
      • 1970-01-01
      相关资源
      最近更新 更多