如何用C语言在数组中存储echo的输入

如何用C语言在数组中存储echo的输入,c,C,如果我要在终端中键入echo“1001”|/test 而test获取“1001”并将其存储到一个数组中,我该怎么做 在test.c中: #include <stdio.h> main() { int c, i, j; int a[4]; while(c = (getchar() != EOF)) { a[i++] = c; } for(j = 0; j < 5; j++ { printf("%d", a[j]); } } #包括

如果我要在终端中键入
echo“1001”|/test

test
获取“1001”并将其存储到一个数组中,我该怎么做

test.c
中:

#include <stdio.h>
main()  {
  int  c, i, j;

  int a[4];
  while(c = (getchar() != EOF)) {
    a[i++] = c;
  }
  for(j = 0; j < 5; j++ {
    printf("%d", a[j]);
  }
}
#包括
main(){
int c,i,j;
int a[4];
而(c=(getchar()!=EOF)){
a[i++]=c;
}
对于(j=0;j<5;j++{
printf(“%d”,a[j]);
}
}

但是它不工作。

您还没有初始化
i
变量,所以它是垃圾。此外,条件应该是
,而((c=getchar())!=EOF)
我发现这个程序可以工作:

#include <stdio.h>

int main(int argc, char** argv)
{
  int  c, i = 0, j;

  int a[4];
  while((c = getchar()) != EOF && i < 4)
  {
    a[i++] = c;
  }

  for(j = 0; j < 4; j++)
  {
    printf("%c", a[j]);
  }
  printf("\n");  // Be nice to non-windows users :)

  return 0;
}
#包括
int main(int argc,字符**argv)
{
int c,i=0,j;
int a[4];
while((c=getchar())!=EOF&&i<4)
{
a[i++]=c;
}
对于(j=0;j<4;j++)
{
printf(“%c”,a[j]);
}
printf(“\n”);//善待非windows用户:)
返回0;
}
您的原始程序有几处更改。初始化
i
,限制读取的字符数,只输出4个字符(
j<4
),并修复一些语法(缺少括号和
int main(int argc,char**argv)
)。哦,还有
(c=getchar())!=EOF
,因为您首先要存储角色,然后进行比较

我还将
%d
更改为
%c
,以便打印字符。如果需要,您可以将其更改回原来的位置,这取决于您实际希望程序生成的内容

  • i
    初始化为0
  • 在代码中:

    c = (getchar() != EOF)
    
    意味着c是一个布尔值,而不是从输入中得到的字符。将其更改为:

    (c = getchar()) != EOF
    

  • 为什么要逐字读?读这行就行了

    char line[50];
    fgets(line, sizeof(line), fp);
    // line now contains "1001\n". You can chop off the \n with the following line:
    line[strlen(line)-1] = '\0';
    

    两个优点;您错过了(3)EOF之前的数据中有5个字符,因此存在缓冲区溢出;(4)无法使用
    %d
    打印字符串;(5)如果将
    %d
    更改为
    %s
    ,则没有以空结尾的字符串(因此,数组中至少需要6个字符和显式空终止符,或者至少需要5个字符和
    %.5s
    ,才能在输出中包含换行符)。@Jonathan Leffler:感谢您的修订。:PIgnore关于
    printf()
    格式的注释;我误读了代码。+1:很好……这很合理(至少在非Windows机器上)以换行结束输出。但您选择了关键点-
    i=0
    while
    条件,缓冲区溢出,打印格式不正确。欢迎使用堆栈溢出。请尽快阅读该页。请注意,通常说“它不工作”并没有多大帮助。你应该明确你看到的行为。在这种情况下,你(应该)打印了许多Control-a字符,无论你是否能看到它们。正如答案所指出的,你对
    i
    未初始化,
    while
    循环中的条件有问题(这是将Control-A存储在
    c
    中,从而存储在字符串中)、缓冲区溢出和不正确的打印格式。好的;忽略
    printf()
    格式注释-我误读了代码。正如我向其他人指出的那样-两点很好;您错过了(3)EOF之前的数据中有5个字符,因此您有缓冲区溢出和(4)无法使用
    %d
    和(5)打印字符串。如果将
    %d
    更改为
    %s
    ,则没有以空结尾的字符串(因此数组中至少需要6个字符和显式空结尾,或者至少需要5个字符和
    %5s
    将换行包含在输出中)。好的,在这个非常具体的输入数据中-当然。在其他情况下,我们可以发现许多其他潜在问题,但我认为我们不应该。但我不明白您在本文中对%s的含义-它不是字符串,而是int数组。我似乎无法读取;我非常习惯于读取
    int
    ,然后用复制到
    char
    e> getchar()我没有注意到它实际上在干什么……我(非常)糟糕。