Удалить символы в строке, стоящие на четных местах; удалить лишние пробелы и знаки табуляции в строке, заменив одним пробелом - 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
Объяснение кода листинга программы
- В начале программы подключаются необходимые библиотеки: stdio.h и string.h.
- Определяется размер буфера в 1000 символов (переменная BUFF_SIZE).
- В функции main() объявляются две переменные типа char: buff и res. Первая используется для чтения строки из стандартного ввода, вторая - для хранения результата.
- В цикле while считывается строка из стандартного ввода до нажатия клавиши Enter.
- В первой части программы удаляются все символы табуляции из строки. Для этого используется функция strchr(), которая ищет первый символ табуляции в строке. Если такой символ найден, он заменяется на пробел. Процесс продолжается до тех пор, пока не будут найдены все символы табуляции.
- Во второй части программы удаляются все четные символы из строки. Для этого используется цикл for и функция memmove(), которая перемещает символы с нечетными индексами на позиции с четными индексами.
- В третьей части программы удаляются все лишние пробелы и знаки табуляции из строки. Для этого используется цикл for, который проходит по каждому символу строки. Если текущий символ не является пробелом, то он добавляется в результирующую строку. При этом проверяется, не является ли следующий символ пробелом (если это так, то он пропускается). Если текущий символ является последним символом в строке, то он также добавляется в результирующую строку.
- В конце программы выводится результирующая строка.
- Программа завершается после нажатия клавиши Enter.
- Возвращаемое значение функции main() равно 0, что означает успешное завершение программы.