Распечатать строку char за символ без пробелов - PullRequest
0 голосов
/ 15 октября 2019

В моей задаче домашнего задания мой инструктор хочет, чтобы мы написали программу, которая будет печатать строку за символом в новых строках, но будет игнорировать пробелы и печатать повторяющиеся символы в той же строке. Так, например, печать «Hello World» char по char вернет

H
e
ll
o
W
o
r
l
d

Я смог получить свой код для печати строкового символа за символом, но не смог распечатать дубликаты на том же самомлиния или игнорировать пробелы. Я посмотрел на некоторые другие подобные вопросы, и кажется, что это не тривиальная задача.

#include <stdio.h>

void print_string(const char instring[]);

int main(void)
{
    print_string("Hello World");
    return 0;
}

void print_string(const char *instring)
{
        while(*instring!='\0')
    {
        printf("%c\n",*instring++);
    }
    return;
}

При этом каждая буква будет возвращаться примерно так:

H
e
l
l
o

W
o
r
l
d

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

Ответы [ 2 ]

1 голос
/ 15 октября 2019

Вы можете иметь указатель на предыдущий символ и использовать его, чтобы узнать, когда печатать новую строку. Кроме того, вам необходимо проверить наличие пробелов перед печатью текущего символа. Как:

#include <stdio.h>

void print_string(const char instring[]);

int main(void)
{
    print_string("Hello World");
    return 0;
}

void print_string(const char *instring)
{
    const char *p = NULL;
    while(*instring!='\0')
    {
        if (p != NULL && *instring != *p && *instring != ' ') printf("\n");
        if (*instring != ' ') printf("%c",*instring);
        p = instring++;
    }
    printf("\n");
    return;
}

Вывод:

H
e
ll
o
W
o
r
l
d
1 голос
/ 15 октября 2019

Внутри вашего цикла while(*instring!='\0') у вас должен быть другой цикл, который проверяет символы, следующие за текущим символом. Вы также должны пропустить символ, если это пробел. Например:

    while(*instring!='\0') {
        if (isspace(*instring)) {
            instring++;
        } else {
            printf("%c",*instring);
            int i= 1;
            while (*instring == *(instring+i)) {
                printf("%c",*(instring+i));
                i++;
            }
            printf("\n");
            instring += i;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...