Я ищу способ проверить следующий символ в строке без увеличения строки, используя определенный синтаксис моего файла while.
Я пробовал некоторые ++str, но это увеличивает строку.
void test(char *str)
{
while(*str)
{
if (*str++ != ' ')
ft_putchar(*str);
str++;
}
}
Я хотел бы putchar, только если следующий символ не является пробелом.
У вас, ребята, есть идеи?
Зачем нужно проверять следующий символ? Правильный ответ — написать цикл так, чтобы он имел смысл для всего, что вы пытаетесь сделать. Вы пытаетесь удалить пробелы при печати?
Итак, что должно произойти, если следующий char является пробел? Прервать цикл? Пропустить текущий символ?
Это часть более крупного упражнения, которое я уже знаю, но хочу выполнить упражнение с другим синтаксисом. В этом упражнении я должен вернуть char**, размещая каждое слово в char* без пробелов. Я бы использовал это для подсчета слов, проверяя, является ли следующий символ разделителем.
Тогда просто считать разделители? while(*str != '\0') { if (*str == ' ') count++; str++; }.
Дело в том, что если у меня есть строка: "Привет пространствопространствопространство yo", функция должна вернуть 2 слова
Поэтому я должен проверить текущий символ и следующий, чтобы убедиться, что это слово
Нет, вы strcmp от начала символа до следующего пробела, а затем как-то сохраняете результаты.
Чтобы выполнить упражнение, мне нужно создать все функции, которые я хочу использовать, и я не могу использовать более 5 различных функций (включая ft_putchar). Поэтому я предпочитаю не использовать strcmp (даже если я знаю, как его написать). Я могу использовать только malloc без его перекодирования.





[РЕДАКТИРОВАТЬ] Основываясь на том, что было сказано в комментариях, вы можете посмотреть стрстр для поиска дубликатов после того, как вы разобьете строку на слова. Также для разбиения на слова вы можете проверить стрсеп.
Если вы хотите проверить следующий символ, вы должны сделать это.
void test(char *str)
{
while(*str)
{
if (*(str + 1) != ' ')
ft_putchar(*str);
str++;
}
}
Синтаксис *(str + 1) работает из-за того, как работает арифметика указателя, поскольку str является char *, он перейдет к следующему char перед разыменованием. Как заметил Никос С. в комментариях, str[1] также работает, и это «более чистый» синтаксис.
Это самый простой синтаксис, который проверяет следующий символ, предполагая, что ваша строка завершается 0 из-за того, что нет необходимости проверять, существует ли другой символ, поскольку в противном случае не будет введено время.
Или просто str[1].
Почему именно вы хотите напечатать последний символ перед пробелом?
@НикосС. хорошее наблюдение, надеюсь, вы не возражаете, если я добавлю это к ответу
Ой ну спасибо ! Я долго искал. Большое спасибо ! :)
@Lundin Я не хочу, но это было в требованиях, заявленных OP
@xception Вот почему нам нужно выудить то, что они на самом деле хотят, прежде чем публиковать ответ. Это типичный «вопрос XY».
@AlexandredeTemmerman, если вас устраивает одно из предложенных решений, вы должны пометить ответ как принятый, иначе люди будут продолжать отвечать на вопрос и тратить свое время на чтение ваших требований без уважительной причины. Обычно говорят, что вы должны принять ответ, как только он будет соответствовать вашим требованиям к вопросу, чтобы люди могли помочь другим своим временем.
Хорошо хорошо, я сделаю это немедленно!
Первый вопрос о SO, поэтому я этого не сделал
@AlexandredeTemmerman Я только что отредактировал его через несколько секунд после того, как вы приняли.
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] );
}
}
Я не могу использовать циклы. Только пока, я должен был написать это извините.
@AlexandredeTemmerman Смотрите мой обновленный пост. Обратите внимание на реализацию последней функции.
Извините за отсутствие приращения, я не знаю, почему оно отображается без приращения