getchar() != EOF Цикл просмотра следующего символа

Недавно я услышал, как мой профессор говорил о том, что он может сделать что-то подобное. Я не могу найти ни одного метода, который бы звучал так. Так что мой вопрос в силе. В стандартном цикле getchar while, как можно было бы заглянуть в следующий char. В этом цикле я передаю некоторые массивы и переключаю символы цикла с символов массива на символы массива новостей для строки, которая вводится через командную строку.

в любом случае код делает то, для чего он предназначен, в большинстве случаев, за исключением того, что он также должен рассматривать символы «/t» и т. д. как один символ, а не как два. Я думал проверить if(c == '\') а затем проверить, будет ли следующий символ r, t, n и т.д.

Вопрос TL: DR: как заставить этот цикл находить escape-символы и рассматривать их как один символ вместо двух? Спасибо большое.

void tr_str(char s[], char news[]){
int c;
size_t k =0;
    while ((c = getchar()) != EOF)
    {
        for(k=0; k < strlen(s);k++)
        {                   
            if(c == s[k])
            {
                c = news[k];
            }
        }
        putchar(c);
    }
}

person TheUnknown    schedule 08.02.2015    source источник


Ответы (1)


Вы просматриваете следующий символ, читая его, а затем вызывая ungetc().

int c;
while ((c = getchar()) != EOF) {
    if (c == 'x') {
        ungetc(c, stdin);
        break;
    }
    ...
}

Однако, когда вы обрабатываете escape-последовательности, вам просто нужно getchar() дважды.

while ((c = getchar()) != EOF) {
    if (c == '\\') {
        c = getchar();
        switch (c) {
        case EOF: ...
        case 'n': ...
        case 't': ...
        }
    }
    ...
}
person Dietrich Epp    schedule 08.02.2015
comment
Потрясающий. Есть ли способ совместить это с тем, что у меня еще есть? В настоящее время программа выполняет и то, и другое, но в основном нет escape-символов. обычно пользователь вводит (a,b,d,e), затем (w,x,y,z), затем строку, программа заменяет первую последовательность второй последовательностью банан = xwnwnw проблемы возникают, когда пользователи вводят (\,n ,\,\,\,b) (x,y,z), а затем говорят '\n''\\''\b' - person TheUnknown; 08.02.2015
comment
Похоже, вы на пути к решению этой проблемы самостоятельно, поэтому я не знаю, что здесь сказать. - person Dietrich Epp; 08.02.2015