Удалить символы в строке, стоящие на четных местах; удалить лишние пробелы и знаки табуляции в строке, заменив одним пробелом - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Надо удалить символы в строке, стоящие на четных местах. И удалить лишние пробелы и знаки табуляции в строке, заменив одним пробелом. Есть код, но надо сделать то же самое через string.h. Как это заварить?
#include <stdio.h>
 
int main(int argc, const char * argv[])
{
    while (1) {
    int a=1000,z,i=0;
    char s[a];
    printf("Введите строку не более %d символов:\n",a);

    /*while (((z=getchar())!=EOF)&(z!='\n')) {
        s[i]=z;
        i++;
    }
    s[i]='\0';
    */
    gets(s);
     char ss[a];
    i=0;
    int f=0,f2=0;
    for (int j=0; s[j]!='\0'; j++) {
        if ((s[j]!=' ')&(s[j]!='\t')) {
            f=1;
            if (f2==0) {
                ss[i]=s[j];
                i++;
                f2=1;
            }
            else {
                f2=0;
            }
           
        }
        else {
            if (f==1) {
                ss[i]=' ';
                i++;
                f=0;
                f2=0;
            }
            else {
                f=0;
                f2=0;
            }
        }
    }
    if (ss[i-1]==' ') {
        ss[i-1]='\0';
    }
    else {
        ss[i]='\0';
    }
    /*
    for (int j=0; ss[j]!='\0'; j++) {
        putchar(ss[j]);
    }
     */
    puts(ss);
    }
    return 0;
}

Решение задачи: «Удалить символы в строке, стоящие на четных местах; удалить лишние пробелы и знаки табуляции в строке, заменив одним пробелом»

textual
Листинг программы
#include <stdio.h>
#include <string.h>
 
 
#define BUFF_SIZE 1000
 
int main( int argc, char **argv)
{
    char buff[BUFF_SIZE];
    char res[BUFF_SIZE];
    
    puts( "enter string");
    fgets( buff, BUFF_SIZE, stdin);
    
    // remove \t
    int tabCounter = 0;
    while( 1)
    {
        char *tabPos = strchr( buff, '\t');
        if( tabPos == NULL)
            break; // табы кончились
        *tabPos = ' ';
        tabCounter++;
    } // while 1
    printf( "tabs removed = %d\n", tabCounter);
    
    // удаляем четные символы
    for(int i = 1; i < strlen(buff); i++)
    memmove( buff+i, buff+i+1, strlen(buff+i));
    
    // чистим от лишних пробелов
    memset( res, 0, BUFF_SIZE);
    for(int i = 0; i < strlen( buff); i++)
    {
        if( buff[i] != ' ')
        {
            char *end = strchr( buff+i, ' ');
            if( end == NULL)
            {
                strcat( res, buff+i);
                break;
            } // if end == null
            else
            {
                end++;
                strncat( res, buff+i, end-(buff+i));
                i = end - buff - 1;
            } // else
        } // if letter
        } // for i < strlen(buff)
    puts( res);
    
    getchar();
    return 0;
} // main

Объяснение кода листинга программы

  1. В начале программы подключаются необходимые библиотеки: stdio.h и string.h.
  2. Определяется размер буфера в 1000 символов (переменная BUFF_SIZE).
  3. В функции main() объявляются две переменные типа char: buff и res. Первая используется для чтения строки из стандартного ввода, вторая - для хранения результата.
  4. В цикле while считывается строка из стандартного ввода до нажатия клавиши Enter.
  5. В первой части программы удаляются все символы табуляции из строки. Для этого используется функция strchr(), которая ищет первый символ табуляции в строке. Если такой символ найден, он заменяется на пробел. Процесс продолжается до тех пор, пока не будут найдены все символы табуляции.
  6. Во второй части программы удаляются все четные символы из строки. Для этого используется цикл for и функция memmove(), которая перемещает символы с нечетными индексами на позиции с четными индексами.
  7. В третьей части программы удаляются все лишние пробелы и знаки табуляции из строки. Для этого используется цикл for, который проходит по каждому символу строки. Если текущий символ не является пробелом, то он добавляется в результирующую строку. При этом проверяется, не является ли следующий символ пробелом (если это так, то он пропускается). Если текущий символ является последним символом в строке, то он также добавляется в результирующую строку.
  8. В конце программы выводится результирующая строка.
  9. Программа завершается после нажатия клавиши Enter.
  10. Возвращаемое значение функции main() равно 0, что означает успешное завершение программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4.364 из 5
Похожие ответы