Консультация № 180442
25.10.2010, 12:28
0.00 руб.
0 5 1
Здравствуйте эксперты!Помогите с программой на С под Юникс. Условие:Дана строка содержащая слова, разделенные одним или несколькими разделительными символами ( пробелами,табуляторами) в начале строки и в конце строки также могут находится разделительные символы.Сформировать новую строку, в которой из слов исходной строки удалить все символы, стоящие на нечетных местах.Слова в новой строке разделить одним пробелом. В начале строки и в конце не должно быть разделительных символов.

Заранее Большое Спасибо!!!!!

Обсуждение

Неизвестный
26.10.2010, 20:34
общий
Magma:
из слов исходной строки удалить все символы, стоящие на нечетных местах
На нечетных местах в строке, или на нечетных местах в слове? И считать нумерацию строки/слова с единицы или нуля?
Неизвестный
26.10.2010, 22:48
общий
это ответ
Здравствуйте, Magma!
Программа. Компилировал GCC.
Код:
/* 
* File: main.c
* Author: Micren
*
* Created on 26 Октябрь 2010 г., 18:13
*/

#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/*
*
*/

// Разделители. По условию - табуляция и пробел
const char DELIMITERS[] = " \t";

// Ф-я принимает адреса исходной и конечной строк.
// Делает работу согласно условия и возвращает длину результирующей строки
// Если dst==NULL то ф-я просто считает длину результирующей строки
size_t process(const char* const src, char* dst);

int main(int argc, char** argv)
{
// Вводим строку
char str[LINE_MAX];
printf("Введите строку:\n");
if (!fgets(str, LINE_MAX, stdin))
{
return EXIT_FAILURE;
}

// fgets() читает и символ перевода строки. Удалим его.
size_t str_size = strlen(str);
if (str_size && str[str_size - 1] == '\n')
{
str[str_size - 1] = 0;
}

printf("Исходная строка:"%s"\n", str);

// Подсчитаем размер результирующей строки
size_t dst_size = process(str, 0);
char *dst = malloc(dst_size);
if (!dst)
{
fprintf(stderr, "Not enough memory\n");
return EXIT_FAILURE;
}

process(str, dst);

printf("Результат:"%s"\n", dst);

free(dst);

return (EXIT_SUCCESS);
}

size_t process(const char* const src, char* dst)
{
if (!src)
{
fprintf(stderr, "size_t process(const char* const src_str, char* dst_str): Не верный параметр src_str\n");
exit(EXIT_FAILURE);
}

// Количество символов
int count = 0;

// strtok() изменяет исходную строку поэтому скопируем ее куда-нибудь
char* buffer = malloc(strlen(src) + 1);
if (!buffer)
{
fprintf(stderr, "Not enough memory\n");
exit(EXIT_FAILURE);
}
strcpy(buffer, src);


// Идем по строке в поисках лексем
char* current = strtok(buffer, DELIMITERS);
while (current)
{
// Будем использовать для нахождения нечетных мест
// Нумерация символов в слове с 1, а не с 0.
// Если надо другое - измените
int flag = 1;
for (; *current; ++current, ++flag)
{
if (flag & 1)
{
continue;
}
++count;
if (dst)
{
*dst++ = *current;
}
}

current = strtok(0, DELIMITERS);

// Имеет ли смысл добавлять пробел?
if (current && current[1] && count)
{
++count;
if (dst)
{
*dst++ = ' ';
}
}
}

if (dst)
{
*dst = 0;
}

free(buffer);

return count + 1;
}

Программа удаляет символы стоящие на нечетных местах именно в словах, а не в строке. Если надо другое поведение, то не сложно исправить. Т.е от строки "1234 5678" останется "24 68".

Примеры работы:
Код:
~/NetBeansProjects/180442/dist/Debug/GNU-Linux-x86> ./180442 
Введите строку:
1234 5678
Исходная строка:"1234 5678"
Результат:"24 68"

~/NetBeansProjects/180442/dist/Debug/GNU-Linux-x86> ./180442
Введите строку:
1 23 456 7890
Исходная строка:" 1 23 456 7890 "
Результат:"3 5 80"

давно
Посетитель
276566
297
27.10.2010, 09:14
общий
Micren:
удалить все символы которые стоят в слове на нечетных местах
Неизвестный
27.10.2010, 18:23
общий
Magma:
Ну оно так и есть в программе.
Неизвестный
27.10.2010, 23:38
общий
Magma:
Изменил немного программу.

И комментарий не забудьте в начале программы удалить, перед тем как сдать её.
Форма ответа