Вопрос о конкретном синтаксисе в то время как в C

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

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

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

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

У вас, ребята, есть идеи?

Извините за отсутствие приращения, я не знаю, почему оно отображается без приращения

Alexandre de Temmerman 24.05.2019 15:43

Зачем нужно проверять следующий символ? Правильный ответ — написать цикл так, чтобы он имел смысл для всего, что вы пытаетесь сделать. Вы пытаетесь удалить пробелы при печати?

Lundin 24.05.2019 15:46

Итак, что должно произойти, если следующий char является пробел? Прервать цикл? Пропустить текущий символ?

Nikos C. 24.05.2019 15:46

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

Alexandre de Temmerman 24.05.2019 15:50

Тогда просто считать разделители? while(*str != '\0') { if (*str == ' ') count++; str++; }.

Lundin 24.05.2019 15:53

Дело в том, что если у меня есть строка: "Привет пространствопространствопространство yo", функция должна вернуть 2 слова

Alexandre de Temmerman 24.05.2019 15:58

Поэтому я должен проверить текущий символ и следующий, чтобы убедиться, что это слово

Alexandre de Temmerman 24.05.2019 15:58

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

Lundin 24.05.2019 16:01

Чтобы выполнить упражнение, мне нужно создать все функции, которые я хочу использовать, и я не могу использовать более 5 различных функций (включая ft_putchar). Поэтому я предпочитаю не использовать strcmp (даже если я знаю, как его написать). Я могу использовать только malloc без его перекодирования.

Alexandre de Temmerman 24.05.2019 16:05
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
9
130
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

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

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

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

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

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

Или просто str[1].

Nikos C. 24.05.2019 15:50

Почему именно вы хотите напечатать последний символ перед пробелом?

Lundin 24.05.2019 15:50

@НикосС. хорошее наблюдение, надеюсь, вы не возражаете, если я добавлю это к ответу

xception 24.05.2019 15:51

Ой ну спасибо ! Я долго искал. Большое спасибо ! :)

Alexandre de Temmerman 24.05.2019 15:52

@Lundin Я не хочу, но это было в требованиях, заявленных OP

xception 24.05.2019 15:57

@xception Вот почему нам нужно выудить то, что они на самом деле хотят, прежде чем публиковать ответ. Это типичный «вопрос XY».

Lundin 24.05.2019 16:02

@AlexandredeTemmerman, если вас устраивает одно из предложенных решений, вы должны пометить ответ как принятый, иначе люди будут продолжать отвечать на вопрос и тратить свое время на чтение ваших требований без уважительной причины. Обычно говорят, что вы должны принять ответ, как только он будет соответствовать вашим требованиям к вопросу, чтобы люди могли помочь другим своим временем.

xception 24.05.2019 16:03

Хорошо хорошо, я сделаю это немедленно!

Alexandre de Temmerman 24.05.2019 16:06

Первый вопрос о SO, поэтому я этого не сделал

Alexandre de Temmerman 24.05.2019 16:07

@AlexandredeTemmerman Я только что отредактировал его через несколько секунд после того, как вы приняли.

xception 24.05.2019 16:13

I would like to putchar only if the next char isn't a space.

Вы могли бы использовать

         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
    }

Я думаю, что петля 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] );
    }
}

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

Alexandre de Temmerman 24.05.2019 16:03

@AlexandredeTemmerman Смотрите мой обновленный пост. Обратите внимание на реализацию последней функции.

Vlad from Moscow 24.05.2019 16:09

Другие вопросы по теме