Народ, помогите отладить программу . Ввожу строку, например: erttt3456345fhfsgh rth 5673567 356.
А результат: 3456345 0 0 05673567 0356 erttt fhfsgh rth
Т.е. после каждого пробела вставляется ноль, не пойму почему. Причем, происходитӕто только в строке(функции) с цифрами. Даже, если я просто ввожу пробел, то в результирующей строке будет выведен ноль
Код | #include <iostream>
using namespace std; const int SIZE = 80;
struct Item { char s; Item *next; };
Item *erase(Item *&str); Item *createList(char *str); void *form(Item *in, Item *&outDigits, Item *&outLetters); Item *skip(Item *str); Item *copyDigits(Item *&from, Item *&to); Item *copyLetters(Item *&from, Item *&to); void showItem(Item *list);
int main(){ Item *list = NULL, *outDigits = NULL, *outLetters = NULL; char buf[SIZE]; while(cout << "Enter string: ", cin.getline(buf, SIZE)){ list = createList(buf); form(list, outDigits, outLetters); cout << "Result string: "; showItem(outDigits); cout << endl; showItem(outLetters); cout << endl; erase(outDigits); erase(outLetters); erase(list); } }
//создаю список из введенной строки Item *createList(char *str){ Item *begin = NULL, *end = NULL; if(str == ""){ return NULL; } while(*str){ Item *k = new Item; k->s = *str++; k->next = NULL; if(begin == NULL){ begin = k; } else { end->next = k; } end = k; } return begin; }
//создаю головные элементы, фильтрую и раскидываю по соответствующим спискам void *form(Item *in, Item *&outDigits, Item *&outLetters){ Item headDigits = {' ', NULL}, headLetters = {' ', NULL}; outDigits = &headDigits; outLetters = &headLetters; while(in = skip(in)){ if(in->s >= '0' && in->s <= '9'){ outDigits = copyDigits(in, outDigits); } else { outLetters = copyLetters(in, outLetters); } } outDigits = headDigits.next; outLetters = headLetters.next; }
//фильтр Item *skip(Item *str) { while(str && ((str->s < '0' || str->s > '9') && (str->s < 'A' || str->s > 'Z') && (str->s < 'a' || str->s > 'z'))){ str->s = str->s++; } return str; }
//создаем список цифр Item *copyDigits(Item *&from, Item *&to) { while(from!=NULL && (from->s >= '0' && from->s <= '9')){ Item *k = new Item; k->s = from->s; k->next = NULL; to->next = k; to = k; from = from->next; } to->next = new Item; to = to->next; to->s = ' '; to->next = NULL; return to; }
//создаем список букв Item *copyLetters(Item *&from, Item *&to){ while(from!=NULL && (from->s >= 'A' && from->s <= 'Z' || from->s >= 'a' && from->s <= 'z')){ Item *k = new Item; k->s = from->s; k->next = NULL; to->next = k; to = k; from = from->next; } to->next = new Item; to = to->next; to->s = ' '; to->next = NULL; return to; }
//выводим список void showItem(Item *list){ while(list){ cout << list->s; list = list->next; } }
//очищаем память Item *erase(Item *&str){ Item *tmp; while(str){ tmp = str; str = str->next; delete tmp; } return NULL; }
|
|