对输入空数组感到困惑。

时间:2015-06-01 00:16:23

标签: c arrays string algorithm

说我输入一下: " Hello world" //打了一个新线 "再见世界" //第二次输入

我如何扫描两条线并分别在两个不同的阵列中输入它们。我相信我需要使用getchar直到它击中' \ n'。但是我如何扫描第二个输入。

提前致谢。我是C的初学者,所以请不要指点,因为我还没有涵盖那个主题。

2 个答案:

答案 0 :(得分:0)

你应该看的功能是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.还有标准输出的stdout(文件描述符1)和错误消息和诊断的stderr(文件描述符2)。文件描述符编号对应于shell中使用的编号:

$$$ - &GT; cat somefile&gt; someotherfile 2&gt;&amp; 1

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

  

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

因此,为了使代码更加健壮,如果获得NULL结果,则需要使用feof检查错误或使用feof检查文件结尾并批准响应。此外,永远不要 EVER 使用。您可以安全使用它的唯一方法是您必须能够看到未来,显然没有人可以这样做,它无法安全使用。它只会打开你的缓冲区溢出攻击。

答案 1 :(得分:0)

尝试使用此代码:

bytea

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