我必须更改代码中的哪些内容才能获得正确的结果?

What do I have to change in my code to get the right result?

怎样才能得到我想要的结果?

我的代码反转文件和文件的每一行,并在我的代码中的 lines.But 前面打印一个数字,但效果不佳。 示例:

test.txt :
alma
barack
szilva
Result:
3 avlizs
2 kcarab
1 amla

我的问题是我得到了这个结果:

只有 3 个号码,但我还需要 1 和 2。

3 avlizs
kcarab
amla

我必须更改我的代码才能正常工作吗?

#ifndef REVERSE_H
#define REVERSE_H

void reverse( FILE *fp, char *name);

#endif /* REVERSE_H */ 
#include <stdio.h>
#include "reverse.h"

int main( int argc, char *argv[])
{
  if ( argc < 2 )
  {
    reverse( stdin, "stdin"); /* stdin */     
  }
  else
  {
    int i;
    for ( i = 1; i < argc; ++i )  /* fájlnevek */     
    {
      FILE *fp = fopen( argv[i], "r");
      if ( NULL != fp )
      {
         reverse( fp, argv[i]); /* fp-ről olvas */
         fclose(fp);
      }
      else
      {
        fprintf(stderr,"Can't open %s for read\n",argv[i]);       
      }
    }
  }
  return 0;
}



#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "reverse.h"

#define INITCAP 4     
#define BUFSIZE 1024  

char **read( FILE *fp, int *pLines);
void   write( char **lines, int nLines, char *name);
void   revline( char *line);
void   memoria( void *ptr);

void reverse( FILE *fp, char *name)
{
  int nLines = 0;
  char **lines = read( fp, &nLines);    
  write( lines, nLines, name); 
}

     
char **read( FILE *fp, int *pLines)
{
  int  capacity = INITCAP;   
  int  nLines   = 0;         
  char buffer[BUFSIZE]; 
 
  char **lines = (char **)malloc(capacity * sizeof(char*));
  memoria(lines);
  while ( NULL != fgets(buffer, BUFSIZE, fp) ) 
  {
    int len = strlen(buffer);    
    if ( '\n' == buffer[len-1] )  
    {
      buffer[len-1] = '[=14=]';     
    }
    if ( nLines == capacity )   
    {
      capacity *= 2;         
      lines = realloc( lines, capacity * sizeof(char *));
      memoria(lines);
    }
    lines[nLines] = (char *) malloc(len+1);    
    memoria(lines[nLines]);
    strcpy( lines[nLines], buffer);     
    ++nLines;
  }
  *pLines = nLines;  
  return lines;
}

void   write( char **lines, int nLines, char *name)
{
  
  for (int i = nLines-1; i >= 0; --i) 
  {
    char *curr = lines[i];
    fprintf( stdout, " %d " ,  i+1 );
    revline(curr); 
    free( curr);
  }
  free(lines);
}

void revline( char *line)
{
  int len = strlen(line);     
  while ( --len >= 0 )
  {
    fputc( line[len], stdout);      
  }
  fputc( '\n', stdout);
}

void memoria( void *ptr)
{
  if ( 0 == ptr )
  {
    fprintf( stderr, "Memory allocation failed!\n");
    exit(1);    
  }   
}

猜测 你的文本文件是在 Windows 上生成的,带有 \r\n 行结尾,你的程序在 UNIX 上运行。 如果是这种情况,fopen(..., "r") 调用不会将这些行尾转换为 \n(它会在 Windows 上完成)并且当您剥离最后一个 \n\r 保留在末尾。 显示这样一行会跳到左边距并覆盖之前写的数字。

我建议这个剥离,只是为了确定

    while ( len && ('\n' == buffer[len-1] || '\r' == buffer[len-1]) )  
    {
      buffer[--len] = '[=10=]';
    }

但这只是猜测...