문제
stdin의 내용을 바꾸는 방법에 대한 조언이 필요합니다.이것은 stdin 반전을 처리하는 코드의 일부입니다.
int reversestdin(FILE *file)
{
int a, b;
int lineas=0;
while ((a=fgetc(stdin)) !=EOF)
{
if (a=='\n')
lineas++;
}
for(b=0; b<lineas; b++)
{
rewind(stdin);
int d,len, e;
char str[2048], *ptr;
for(e=0; e<=b; e++)
{
fgets(str, 2048, stdin);
}
ptr=str;
for(d=0; d<2048; d++)
{
if(*ptr=='\n') break;
if(*ptr=='\0') break;
ptr++;
}
len=d;
ptr--;
for(d=len; d>0; d--)
{
printf("%c", *ptr--);
}
printf("\n");
}
return 0;
}
또한 다음 내용이 포함된 example1이라는 .txt 파일도 있습니다.
LINE 1.1
LINE 1.2
LINE 1.4
이 코드는 내가 실행할 때 작동합니다. ./myprogram < example1.txt
.출력한다
1.1 ENIL
2.1 ENIL
4.1 ENIL
하지만 내가 실행하면 echo "This text should be reversed" | ./myprogram
다음과 같이 출력됩니다.
(
그게 다야.개방형 브래킷.나는 라인 수를 계산하는 코드 부분을 생략하고 수동으로 1라인이 있다고 말하면 작동한다는 것을 발견했습니다(물론 1라인에 대해).
int reversestdin(FILE *file)
{
int a, b;
int lineas=1;
//while ((a=fgetc(stdin)) !=EOF)
//{
//if (a=='\n')
//lineas++;
//}
for(b=0; b<lineas; b++)
{
rewind(stdin);
int d,len, e;
char str[2048], *ptr;
for(e=0; e<=b; e++)
{
fgets(str, 2048, stdin);
}
ptr=str;
for(d=0; d<2048; d++)
{
if(*ptr=='\n') break;
if(*ptr=='\0') break;
ptr++;
}
len=d;
ptr--;
for(d=len; d>0; d--)
{
printf("%c", *ptr--);
}
printf("\n");
}
return 0;
}
이제 출력됩니다
desrever eb dluohs txet sihT
해결책
첫째, 되감기 stdin
(이론적으로) 입력 파일에서 리디렉션되지 않는 한 지원되지 않습니다.그리고 그런 일이 일어났는지 알 수 있는 방법이 없기 때문에(어쨌든 나도 알고 있지만) 굳이 시도하지 마세요.
즉, 대중적인 의견과는 달리 전체 입력을 버퍼링할 필요는 없습니다.한 번에 한 줄씩 버퍼링할 수 있습니다.
#include <stdio.h>
#include <stdlib.h>
int main()
{
int buffer[2048], ch, lines=0, i=0;
do
{
ch = fgetc(stdin);
if ((ch == '\n') ||
(ch == EOF && i > 0) ||
(i == (sizeof(buffer)/sizeof(*buffer)-1)))
{
++lines;
while (i != 0)
fputc(buffer[--i], stdout);
fputc('\n', stdout);
}
else
{
buffer[i++] = ch;
}
} while (ch != EOF);
return 0;
}
당신이 찾고 있는(또는 그에 가까운) 일을 해낼 것이라고 확신합니다.
다른 팁
되돌릴 수 없습니다. stdin
!
논리를 수정하여 다음까지 읽어야 합니다. EOF
미리 줄 수를 세는 대신.
살펴봐야 할 또 다른 사항은 줄 수를 세는 진술입니다.
편집하다:또한 조작할 수 있는 변수와 동일하게 stdin을 설정하는 것이 좋습니다.그래서 같은 것을 가지고 temp = stdin
따라서 항상 초기 표준 입력이 있고 필요에 따라 조작할 수 있는 임시 입력이 있으며, 돌아가야 하는 경우에도 여전히 표준 입력이 있습니다.
while ((a=fgetc(stdin)) !=EOF)
{
if (a=='\n')
lineas++;
}
생각해 보면, 입력한 줄에는 개행 문자가 없으므로 프로그램은 여전히 0줄이 있다고 생각합니다.그래서 처음에 설정하거나 lineas = 1
또는 콘텐츠가 있는지 여부를 모르는 경우 콘텐츠에 문자가 있는지 확인할 수 있으므로 잠시 후 또는 콘텐츠 어딘가에 다음과 같이 말하세요. if lineas == 0 then check for characters
고려해야 할 또 다른 사항은 매직넘버.그것이 바로 당신의 2048년입니다.2048을 '전역' 변수로 만들어서 이 문제를 해결하려고 합니다.
제안된 흐름
당신의 while
당신 대신 진술 for
성명.하지만 그렇게 하세요, while(a != EOF)
여기서 a는 char
그러니 계속 해라 fgetc
.그런 다음 배열 끝에서 크기 2048의 문자 배열에 넣고 뒤로 작업하십시오(또는 0에서 문자 배열에 넣은 다음 뒤로 이동하는 for 루프를 가질 수 있습니다...즉, 카운터가 있으면 편리합니다.)하지만 당신은 갖고 싶어 if a=='\n'
그런 다음 줄을 거꾸로 인쇄하고 배열 인덱스를 2048로 재설정합니다.또한 배열에서 뒤로 이동할 때 문자 수를 세는 카운터를 갖는 것이 좋습니다. 2048-counter
.
이는 보다 간결한 흐름을 만드는 데 도움이 될 것입니다.또한 많은 코드가 필요하지 않습니다.