문제

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.

이는 보다 간결한 흐름을 만드는 데 도움이 될 것입니다.또한 많은 코드가 필요하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top