Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа со строками, Без использования string.h! 
:(
    Опции темы
1901Maxim
Дата 3.12.2008, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 30.6.2007

Репутация: нет
Всего: нет



Код

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <ctype.h>

int found (char const str1[], char slovo[])
{
    return 0;
}

void conv (char const str1[], char str2[])
{
    int i, j;
    i = -1;
    j = 0;
    int con = 0; //conec stroki str2
    int i1 = 0; //poziciya kursora v str2
    char slovo[256]=""; // slovo dlya poiska
    int sl;

    //cikl dlya vsei stroki
    do
    {
        i++;
        //vibiraem slovo is stroki
        do
        {
            slovo[j] = str1[i];
            i++;
            j++;
        }while ((str1[i])||(isspace(str1[i])));
        //sravnivaem

        int f = found(str1, slovo);
        if (f == 0)
        {
            sl = j; //bukvi slova
         for (i1 = con; i1<=j; i1++)
         {
            str2[i1] = slovo[j - sl];
            sl--;
         }
         str2[i1++] = ' ';
         con = i1+1;
         j=0;
        }
    }while (str1[i]);

}

void main (void)
{
    char str1[256]="";
    char str2[256]="";
    clrscr();
    printf("Vvedite ishodnuu stroku:\n");
    scanf("%s", str1);
    conv (str1, str2);
    printf("\n%s\n", str2);
    getch();
}

Почему функция conv возвращает только пеервое слово? Помогите разобраться, а то глаз уже замылился.
PM MAIL   Вверх
vinick
Дата 3.12.2008, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 9.6.2005

Репутация: 3
Всего: 22



scanf("%s") читает ввод до первого пробельного символа. у тебя просто нет других слов кроме первого.
А функция conv содержит ошибки и вобще непонятно что должна делать.

PM MAIL ICQ Jabber   Вверх
1901Maxim
Дата 3.12.2008, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 30.6.2007

Репутация: нет
Всего: нет



А, понятно, спасибо. Функция на данном этапе просто должна была разобрать строку по словам, и закинуть во вторую переменную (это я так задачу делаю))). 
И ошибок там нет.

Это сообщение отредактировал(а) 1901Maxim - 3.12.2008, 23:43
PM MAIL   Вверх
vinick
Дата 4.12.2008, 03:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 9.6.2005

Репутация: 3
Всего: 22



Цитата(1901Maxim @  3.12.2008,  23:30 Найти цитируемый пост)
И ошибок там нет.

Спорим ?

Код

do
    {
        i++;
        //vibiraem slovo is stroki
        do
        {
            slovo[j] = str1[i];
            i++;
            j++;
        }while ((str1[i])||(isspace(str1[i])));

Если str1 пустая строка, то идем далеко и надолго, потому как двойным увеличением i, проскакиваем завершающий ноль.
Условие в while тут вобще проверяет только str[i], вторая часть с isspace  будет вычисляться только когда str1[i] ==0.
Если слова разделены не одним, а несколькими пробелами, или строка начинается с пробела,  получим slovo состоящее из одного пробела. Пробелы в конце строки тоже частично будут скопированы.
Код

    sl = j; //bukvi slova
         for (i1 = con; i1<=j; i1++)
         {
            str2[i1] = slovo[j - sl];
            sl--;
         }
         str2[i1++] = ' ';
         con = i1+1;
         j = 0;

for выполняется j+1 итераций, хотя символов в slovo записано было только j, в str2 записывается мусор.
После выхода из цикла j обнуляется, значит на второй и последующих итерациях внешнего цикла может быть con > j.
При выходе из цикла for,  i1 дважды увеличивается и получаем еще одну дырку с мусором.
PM MAIL ICQ Jabber   Вверх
1901Maxim
Дата 4.12.2008, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 30.6.2007

Репутация: нет
Всего: нет



Цитата

Если str1 пустая строка, то идем далеко и надолго, потому как двойным увеличением i, проскакиваем завершающий ноль.

Все нормально завершается.
Цитата

Условие в while тут вобще проверяет только str[i], вторая часть с isspace  будет вычисляться только когда str1[i] ==0.

Почему?
Цитата

Если слова разделены не одним, а несколькими пробелами, или строка начинается с пробела,  получим slovo состоящее из одного пробела. Пробелы в конце строки тоже частично будут скопированы.

В данный момент это не важно. Но все равно спасибо, изменю.
Цитата

for выполняется j+1 итераций, хотя символов в slovo записано было только j, в str2 записывается мусор.
После выхода из цикла j обнуляется, значит на второй и последующих итерациях внешнего цикла может быть con > j.
При выходе из цикла for,  i1 дважды увеличивается и получаем еще одну дырку с мусором.

Сейчас мне это не мешает.
PM MAIL   Вверх
vinick
Дата 4.12.2008, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 9.6.2005

Репутация: 3
Всего: 22



Цитата(1901Maxim @  4.12.2008,  11:28 Найти цитируемый пост)
Почему?

Потому что ИЛИ. Пока первая часть логического выражения истинная, вторая даже не будет вычисляться. Такие правила работы с лог. выражениями в C/C++
PM MAIL ICQ Jabber   Вверх
inside_pointer
Дата 4.12.2008, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 9.3.2008

Репутация: 5
Всего: 12



Код

 for (i1 = con; i1<=j; i1++)
         {
            str2[i1] = slovo[j - sl];
            sl--;
         }
         str2[i1++] = ' ';
         con = i1+1;
         j=0;


con = i1 + 1 до этого i1 выросло до j, в результате на следующем слове con == j+2

получается for(i1 = j+2; i1 <= j; i1++) - ни разу не выполняется

slovo[j-sl] можно переделать в slovo[i1-con]
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0542 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.