Страница 1 из 2

Помогите исправить ошибку в задаче на символьные массивы (язык C)

Добавлено: 02 окт 2008, 09:43
Katiox-xa
Здравствуйте,
Помогите, пожалуйста исправить ошибку в программе, написанную на языке С
В некоторых случаях не работает
Например в строке dshfhjd hjghjg
Выводит hjd


В символьной строке оставить только слова, начинающиеся и заканчивающиеся на одну и ту же букву.(Не использовать встроенных функций обработки строк)



#include <stdio.h>
#define MAXLINE 100

void main (void)
{
int f;
int i, j, k, p, i2, t;
char c;
char str1[MAXLINE];
char str2[MAXLINE]="";
i2=0;
i=0;
while ( (c=getchar())!=EOF && c!='\n')
{
str1=c;
++i;
}
if (c=='\n')
{
str1=c;
++i;
}
str1='\0';

i=p=f=t=0;
while (str1!='\0')
{
if ((str1==' ') || (str1=='.') || (str1=='\n') || (str1==', '))
{
i2=i-1;
if (str1[p]==str1[i2])
f=f+1;
p=i+1;
}
if (f!=0)
{
for (f=t; f<=(t+i-i2+1); f+=1)
str2[f]=str1[i2+f-t-2];
t=f;
f=0;
}
i++;
}
printf ("%s\n", str2);
}

Re: Помогите исправить ошибку в задаче на символьные массивы (язык C)

Добавлено: 02 окт 2008, 19:59
Albor
Несколько сумбурно. Алгоритм должен быть примерно такой: делим входной массив на слова, из этих слов выбираем те у которых крайние символы равны. Важно правильно найти начало и конец слова. Можно воспользоваться функциями STL, например, isalpha(), определяющей, является ли символ буквой, или isspace() - является ли пробелом, или ispunct() - является ли знаком пунктуации.

Re: Помогите исправить ошибку в задаче на символьные массивы (язык C)

Добавлено: 06 окт 2008, 03:07
MrVenom
(Не использовать встроенных функций обработки строк)
а не проще сразу считать строку, а не забивать в массив ее getchar'ом?
getchar полезен тогда, когда посимвольно надо обрабатывать, не храня ничего. Конечно лучше всего и геморнее было б сделать с getcharom и динамическим распределением памяти, но мне лень))) ща так сделаю, если захочешь - переделаешь потом.

Re: Помогите исправить ошибку в задаче на символьные массивы (язык C)

Добавлено: 06 окт 2008, 03:54
MrVenom
Извиняюсь)) ты был прав. Вот код, вроде работает :) ))))
#include <iostream>
using namespace std;
void main(){
cout << "Input string:";
bool space = false;
char out[100], temp[25], c;
int i = 0, i1 = 0;
while ((c = getchar())) {
if ((c != ' ') && (c != '\n')) {
temp = c;
i++;
} else
if ((c == ' ') || (c == '\n')){
if (temp[0] == temp[i-1]) {
for (int j = 0; j < i; j++) {
out[i1] = temp[j];
i1++;
}
out[i1] = ' ';
i1++;
}
i = 0;
}
if (c == '\n') {
out[i1] = '\0';
break;
}
}
cout << "Output string: " << out << "\n";
system("pause");
}

Re: Помогите исправить ошибку в задаче на символьные массивы (язык C)

Добавлено: 06 окт 2008, 10:49
Albor
MrVenom, перечисленные мною функции обрабатывают отдельные символы, а не строки. А для решения данной задачи достаточно одного цикла при считывании строки посимвольно, и, если подумать, то можно обойтись и одним массивом.

Re: Помогите исправить ошибку в задаче на символьные массивы (язык C)

Добавлено: 06 окт 2008, 11:10
MrVenom
Подумал :D вот с одним массивом:
#include <iostream>
using namespace std;
void main(){
cout << "Input string:";
bool space = false;
char out[100], c, first;
bool f = false;
int i = 0, i1 = 0;
while ((c = getchar())) {
if ((c != ' ') && (c != '\n')) {
if (!f) {
first = c;
f = true;
i1 = i;
}
out = c;
i++;
} else
if ((c == ' ') || (c == '\n')){
if (out[i-1] == first) {
out = ' ';
i++;
}
else i = i1;
f = false;
}
if (c == '\n') {
out = '\0';
break;
}
}
cout << "Output string: " << out << "\n";
system("pause");
}

Re: Помогите исправить ошибку в задаче на символьные массивы (язык C)

Добавлено: 06 окт 2008, 14:12
Albor
MrVenom писал(а):Подумал :D вот с одним массивом:

:D Ну, вот, продолжаем разговор: а если во входной строке появятся запятые или тире, или двоеточие и т.п.? Можно ещё избавиться от "флаговой" переменной типа bool, а также, вместо индекса, запоминающего начало слова, попробовать использовать указатель, а если в условных операторах использовать рекомендуемые выше функции, то получится ещё красивее.

Re: Помогите исправить ошибку в задаче на символьные массивы (язык C)

Добавлено: 06 окт 2008, 17:41
MrVenom
Так:
1. тире, и двоеточия всякие будут расцениватся как обычные символы. т.е. если +выа+ то он это слово добавит.
2. чем тебе bool не нравится?
3. если делать с указателями и ваще динамическим выделением памятигемора пипец будет, но вполне возможно
4. ваще какими функциями можно пользоваться?
Хочешь красиво это тебе в денюшку встанет уже))

Re: Помогите исправить ошибку в задаче на символьные массивы (язык C)

Добавлено: 06 окт 2008, 18:17
Albor
1. В условии сказано о буквах, но ни как не о символах '+' и им подобных.
2.Против типа bool абсолютно ни чего не имею против, но в приведенном листинге много ненужных переменных.
3. А ты попробуй, только память динамически выделять не нужно - это лишнее.
4. Какими хочешь, кроме ф-ций обработки строк (условие запрещает). Можно и без функций, но придётся писать сравнительно длинные выражения в if.
Красиво научиться писать - сделает тебе честь, после чего можно и денюжку попросить. Лично для себя я и сам напишу, если понадобится - в этой теме я не проситель.

Re: Помогите исправить ошибку в задаче на символьные массивы (язык C)

Добавлено: 06 окт 2008, 18:35
MrVenom
1. дык ты описал бы конкретно... символы типа "+" будут расцениватся как буквы. с ними что надо делать тоГ? пропускать или удалять или как, или ошибку выводить?... не вводить тогда да и все. ну будет ddg+dd он его запишет все равно.
2. В твоем коде переменных больше по-моему.
3. что указатель - 4 байта, что инт 4 байта, разницы не вижу.
4. тут сам поправь, легче легкого
А вот оскорблять не надо. тоже могу.