Вопрос о конкретном синтаксисе в то время как в C - PullRequest
0 голосов
/ 24 мая 2019

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

Я попробовал немного ++str, но он увеличивает строку.

void  test(char *str)
{
    while(*str)
    {
         if(*str++ != ' ')
             ft_putchar(*str);
        str++;
    }
}

Я бы хотел putchar, только если следующий символ не является пробелом.

Ребята, у вас есть идеи?

Ответы [ 3 ]

2 голосов
/ 24 мая 2019

[РЕДАКТИРОВАТЬ] Основываясь на том, что было сказано в комментариях, вы можете посмотреть на strstr , чтобы найти дубликаты, когда вы разбиваете строку на слова.Также для разбивки на слова вы можете проверить strsep .

Если вы хотите проверить следующий символ, вы должны сделать это.

void  test(char *str)
{
    while(*str)
    {
        if(*(str + 1) != ' ')
             ft_putchar(*str);
        str++;
    }
}

Синтаксис *(str + 1) работает из-за того, как работает арифметика указателей, так как str является символом *, он будет продвигаться к следующему символу до разыменования.Как заметил Никос С. в комментариях, str[1] также работает, и это более «чистый» синтаксис.

Это самый простой синтаксис, который проверяет следующий символ, предполагая, что ваша строка завершается 0 из-за того, что там естьнет необходимости проверять, существует ли другой символ, так как время не будет введено иначе.

1 голос
/ 24 мая 2019

Я хотел бы поставить char, только если следующий символ не пробел.

Вы можете использовать

         if(*(str + 1) != ' ')
             ft_putchar(*str);

Но это на 100% эквивалентно этому, что я нахожу более понятным:

         if(str[1] != ' ')
             ft_putchar(*str);

Более того, я подозреваю, что вы также хотите избежать вывода ограничителя строки, поэтому я, вероятно, структурировал бы все это немного по-другому:

    if (*str) {
        while (str[1]) {
            if (str[1] != ' ') {
                ft_putchar(*str);
            }
            str++;
        }
        str++;  // because the original loop leaves str pointing to the terminator
    }
0 голосов
/ 24 мая 2019

Я думаю, что цикл for больше подходит в этой ситуации. Также параметр должен иметь квалификатор const, поскольку строка не изменяется в функции.

Функция может выглядеть следующим образом

void  test( const char *s )
{
    for ( ; *s; ++s )
    {
        if ( *( s + 1 ) != ' ' ) ft_putchar( *s );
    }
}

Выражение *( s + 1 ) можно заменить на s[1].

Или даже так

#include <ctype.h>

//...

void  test( const char *s )
{
    for ( ; *s; ++s )
    {
        if ( !isspace( ( unsigned char )s[1] ) ) ft_putchar( *s );
    }
}

Если вы хотите использовать именно цикл while, просто напишите, например,

void  test( const char *s )
{
    while ( *s )
    {
        if ( *( s + 1 ) != ' ' ) ft_putchar( *s );
        ++s;
    }
}

Или

void  test( const char *s )
{
    while ( *s )
    {
        if ( !isspace( ( unsigned char )s[1] ) ) ft_putchar( *s );
        ++s;
    }
}

Или вы можете написать функцию также следующим образом

void  test( const char *s )
{
    while ( *s )
    {
        if ( *++s != ' ' ) ft_putchar( s[-1] );
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...