Печать строки назад в C с помощью scanf - PullRequest
0 голосов
/ 14 сентября 2011

Я пытаюсь напечатать свою строку в обратном направлении в c, и я просто не могу заставить ее работать с пробелами.Мне известно, что если после последнего возвращенного символа в функции scanf есть какие-либо пробелы, он будет завершен, поскольку не осталось ни одного существующего символа для сканирования из введенной строки.Вот мой код:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXLETTERS 20

void readStringBackwards();

main()
{
readStringBackwards();
}


void readStringBackwards()
{



printf("Please enter a string of up to 20 characters in length:\n ");
char str[20];
scanf("%s", str);
int i;
int stringlength = strlen(str);

if (stringlength > MAXLETTERS)
{
    printf("The string length is too long!");
}
else
{
    for( i = stringlength-1; i >= 0; i--){

        printf("%c ", str[i]);

    }

}



}

По сути, программа должна принимать до 20 символов и печатать строку в обратном направлении.Я искал информацию о scanf и о том, как он работает, но найти прямой ответ было довольно сложно.Любые советы приветствуются.Прямо сейчас все, что я получу, является первым словом, которое я печатаю наоборот.Другие символы после пробела пропускаются и не сохраняются в массиве.

Ответы [ 3 ]

3 голосов
/ 14 сентября 2011

scanf("%s", str); будет считывать до пробела, даже если его более 20 символов. Пробел, символ новой строки и табуляция считаются пробельными символами.

Подумайте об использовании спецификации формата, такой как "%20[^\n]", которую следует читать до 20 символов, если они не '\n'.

edit: Как отметил Оли Чарльзуорт, буфер должен быть как минимум длиной 21, а не 20.

3 голосов
/ 14 сентября 2011

Почему бы не использовать fgets() вместо scanf()?

char str[21]; // Note 21, not 20 (remember the null terminator)
fgets(stdin, 21, str);

Обратите внимание, что если длина строки не превышает 20 символов, вы включите символ новой строки, поэтому вам придется удалить его (перезапись с помощью '\0' подойдет).

0 голосов
/ 28 марта 2014

Этот код работает отлично, но попробуйте использовать gets() вместо scanf() для чтения пробелов в строке!

...