Can';t在C中的最大行中打印

Can';t在C中的最大行中打印,c,windows,printing,C,Windows,Printing,这个程序应该打印出所有输出中最长的一行。但是这个程序的行为非常怪异。有时它甚至在触发EOF(ctrl+Z)时也不会终止,有时它会打印空白或奇怪的符号。我不知道为什么它不起作用;谁能帮我修一下吗 //START #include <stdio.h> #include <stdlib.h> #define mx 100 int main(void) { int line[mx],lng[mx],c,word,maxim; word=1; maxim=1

这个程序应该打印出所有输出中最长的一行。但是这个程序的行为非常怪异。有时它甚至在触发EOF(ctrl+Z)时也不会终止,有时它会打印空白或奇怪的符号。我不知道为什么它不起作用;谁能帮我修一下吗

//START
#include <stdio.h>
#include <stdlib.h>
#define mx 100
int main(void)
{
    int line[mx],lng[mx],c,word,maxim;
    word=1;
    maxim=10;
    int i=0;
    while((c=getchar())!=EOF)
    {
      while((c=getchar())!='\n')
      {
        line[i]=(c=getchar());
        if(((c=getchar())==' ') || ((c=getchar())=='\t'))
           {
            word++;
           }
         i++;
      }
      if(woasdrd>=maxim)
        {
          for(int d=0;d<=99;d++)
         {
            copyline(lng[d],line[d]);
         }
         word=1;
         i=0;
        }
    else
    {
      i=0;
    word=1;
    } 
    }
for(int g;g<=99;g++)
{
    putchar(lng[g]);
}
}
copyline(int to[],int from[])
{
 for(int i=0;i<=99;i++)
  {
        to[i]=from[i];
    }
}
//END
//开始
#包括
#包括
#定义mx 100
内部主(空)
{
int行[mx],lng[mx],c,word,maxim;
单词=1;
最大值=10;
int i=0;
而((c=getchar())!=EOF)
{
而((c=getchar())!='\n')
{
行[i]=(c=getchar());
如果((c=getchar())='')| |((c=getchar())=='\t'))
{
word++;
}
i++;
}
如果(woasdrd>=最大值)
{

对于(int d=0;d我认为您在太多的地方调用了
getchar()
。每次调用时都会从输入中删除一个字符。实际上,您应该在第一个while循环之前调用
c=getchar()
一次,以读取第一个字符。删除其余的
c=getchar()
只需使用
c
。然后在
i++
之后的内部while循环的末尾,您应该使用
c=getchar()
读取下一个字符。

\
#include <stdio.h>
#include <stdlib.h>

#define mx 100

//copy string array from from[] to to[],and both of it is end with '\0'    
void copyline(char to[],char from[])
{
    int i = 0;
    while( from[i] )     
    {
        to[i]=from[i];
        i++;
    }
}

int main(void)
{
    char line[mx] = { ' ' },lng[mx] = { ' ' }; //line keep the line you just input,lng keep the longest line
    int maxim , c;                             //maxim keep the longest num of longest line
    int i=0;

    maxim=0;

    //get input from stdin ,if EOF then end(Ctrl + C or Ctrl + d is EOF)
    while( ( c = getchar() ) != EOF )
    {
        //if you input a Enter then compare it's length with maxim
        if( c == '\n' )
        {
            line[i++] = '\0';          //turn '\n' into '\0',for string end with '\0'

            if( i > maxim )            //compare the line you just input with the longest line,if get longer one,copy it to lng
            {
                maxim = i;
                copyline( lng , line );
                lng[ i ] = '\0';       //for string end with '\0'
            }
            i = 0;                     //if you get a '\n' ,then you should be ready for next input line,so i = 0,and continue for new get
            continue;
        }
        line[i++] = c;              //keep input to line
    }

    //that's output,for string end with '\0',so put it as condition for while loop
    i = 0;
    while( lng[i] )
    {
        printf("%c",lng[i++]);
    }
    printf("\n");
}
#包括 #定义mx 100 //将字符串数组从[]复制到[],两者都以“\0”结尾 无效复制行(字符到[],字符从[]) { int i=0; while(来自[i]) { to[i]=从[i]; i++; } } 内部主(空) { 字符行[mx]={''},lng[mx]={'};//保留刚才输入的行,lng保留最长的行 int-maxim,c;//maxim保留最长行的最长num int i=0; 最大值=0; //从标准输入获取输入,如果为EOF,则结束(Ctrl+C或Ctrl+d为EOF) 而((c=getchar())!=EOF) { //如果输入Enter,则将其长度与maxim进行比较 如果(c=='\n') { 行[i++]='\0';//将'\n'变成'\0',以'\0'结尾的字符串 if(i>maxim)//将刚输入的行与最长的行进行比较,如果得到更长的行,则将其复制到lng { maxim=i; 复印线(液化天然气,生产线); lng[i]='\0';//对于以'\0'结尾的字符串 } i=0;//如果您得到一个“\n”,那么您应该为下一个输入行做好准备,因此i=0,并继续新的get 继续; } 行[i++]=c;//将输入保留到行 } //这是以“\0”结尾的字符串的输出,所以将其作为while循环的条件 i=0; 而(液化天然气[i]) { printf(“%c”,lng[i++]); } printf(“\n”); }

也许这就是你想要的,一开始我想改进你的代码,但是它有很多错误,包括逻辑和代码,所以我重写了你的代码。如果你对这个代码有问题,请告诉我。

ctr+z不是EOF。它是终止信号。copyline(lng[d],line[d]);您正在传递两个int值并接受两个int数组。您到底想实现什么?Ctrl+…信号键的处理方式与Windows中的处理方式不同。控制台软件有一个,它实际上取代了更传统的信号处理方式,而非更“正常”平台。然而,
Ctrl+Z
并不是处理的信号之一,只有Ctrl+C和Ctrl+Break。你扔掉了你读的第一个和第二个字符。你保存了第三个字符;你读了第四个字符,然后扔掉了第四个字符,如果这恰好是一个空格,你也读了第五个字符。这有很多问题待解析。函数只是
getchar()
(而不是
getchar()
)先生,您能对代码进行国王般的注释,以便我更容易理解正在发生的事情吗?您也能告诉我我的错误是什么吗?我已经更改了代码,添加了注释,如果您仍然感到困惑,请让我知道。如果您完全理解代码,您可以找到您的错误,如果您有问题,请让我知道。谢谢您,先生。这对我很有帮助我自己把代码再说一遍告诉我它是什么:D