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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [c++]Работа со строками, Функция редактирующая строку 
V
    Опции темы
maxnsk82
Дата 20.1.2010, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



У меня задание: 
Функция переписывает строку. Если она находит в строке число, то вместо него она переписывает в выходную строку соответствующее по счету слово из входной строки. (например, "aaa bb1bb cc2cc" - "aaa bbaaabb ccbb1bbcc"). 

Пытался хотя бы строку перекинуть в функцию, а затем обратно, но тоже не работает:

Код

# include <stdio.h>
# include <conio.h>
# include <string.h>

char function(char C);

void main()
{
    char C[256];
    char word[10][128]; // предполагаю что массив под отдельные слова нужен
    printf ("Input words and numbers: \n");
    gets(C);
    printf ("New string: %s", function(C));
    getch();
}


char function(char C)
{
    return C;
}

PM MAIL   Вверх
Peter
Дата 20.1.2010, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



В main() символ C имеет тип char[256], а в функции function() - char. Писать надо хотя бы
Код
char *function(char *C)
{
    return C;
}



--------------------
всё, что делаете, делайте от души, как для Господа (Послание апостола Павла колоссянам, 3:23).
PM MAIL WWW   Вверх
maxnsk82
Дата 20.1.2010, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Проставил *. но так тоже не работает, ошибка: 'function': identifier not found.

Как сделать вообще не втыкаю(...мне бы работающий код, может тогда разберусь, уже 6 часов как пытаюсь сам сделать(
PM MAIL   Вверх
Luyan
Дата 20.1.2010, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Peter @  20.1.2010,  14:02 Найти цитируемый пост)
В main() символ C имеет тип char[256], а в функции function() - char. Писать надо хотя бы

Цитата(maxnsk82 @  20.1.2010,  14:14 Найти цитируемый пост)
Проставил *. но так тоже не работает, ошибка: 'function': identifier not found.

одну? их 4 надо  smile 
Код

# include <stdio.h>
# include <conio.h>
# include <string.h>

char* function(char* str);
int main()
{
    char C[256] = {'4','5'};
    char word[10][128]; // предполагаю что массив под отдельные слова нужен
    printf ("Input words and numbers: \n");
    gets(C);
    printf ("New string: %s", function(C));
    getch();
    return 0;
}
char* function(char* str)
{
    return str;
}

Цитата(maxnsk82 @  20.1.2010,  13:37 Найти цитируемый пост)
Функция переписывает строку. Если она находит в строке число, то вместо него она переписывает в выходную строку соответствующее по счету слово из входной строки. (например, "aaa bb1bb cc2cc" - "aaa bbaaabb ccbb1bbcc"). 

В функцию передаётся массив, возвращать надо будет другой массив. Думаю реализовать надо так: сначала проходим по массиву С и записываем в word[j][i] до тех пор, пока не встретим пробел, затем кладём символ конца строки (word[0][i]= '\0'), и переходим на новую строку массива word и так далее. Потом начинаем копировать строку С в С2 и как только встречаем символ цифры (С[i] >= '0' && С[i] <= '9'), записываем нужную строку из массива word в С2, пока не встретим word[j][y] = '\0';, и так далее. Функция из двух циклов, в чём проблема?


PM   Вверх
maxnsk82
Дата 21.1.2010, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Кажется уже близко. но что-то не так в: word[i][j]='/0', не знаю почему?'=' : truncation from 'int' to 'char' и '=' : truncation of constant value - варнинги выдаёт. и что то с возвращаемым значением не то - туплю по поводу передачи параметров в функцию, никак не доходит(....помогите дописать:

Код

# include <stdio.h>
# include <conio.h>
# include <string.h>
char* function(char *str);
int main()
{
    char C[256];
    printf ("Input words and numbers: \n");
    gets_s(C);
    printf ("New string: %s", function(C));
    _getch();
    return 0;
}
char* function(char* str)
{
    char word[5][20];
    char newstr[256];
    int i=0,j=0,k=0;
    while (str[k] != '/0')                //-----------
    {                                    //
        while (str[k] != ' ')            //    Записываем отдельные слова
        {                                //    в массив word
            word[i][j]=str[k];            //
            j++;k++;                    //
        }word[i][j]='/0';i++;k++;j=0;    //
    }                                    //-----------
    i=0;j=0;k=0;int l=0;

    while (str[k] != '/0')    //пока не закончилась входящая строка..
    {
        if (str[k]<'1'||str[k]>'5')    //..если символ не цифра, переписываем
                                    //символ в новую строку
        {newstr[i]=str[k];i++;k++;}
        else                        //если цифра, то в зависимости от того
        {switch(str[k])                //какая, берём слово из массива word
            {                        // и посимвольно заносим в новую строку
            case '1':while (word[0][j] !='/0')
                     {newstr[i]=word[0][j];j++;i++;};break;
            case '2':while (word[1][j] !='/0')
                     {newstr[i]=word[0][j];j++;i++;};break;
            case '3':while (word[2][j] !='/0')
                     {newstr[i]=word[0][j];j++;i++;};break;
            case '4':while (word[3][j] !='/0')
                     {newstr[i]=word[0][j];j++;i++;};break;
            case '5':while (word[4][j] !='/0')
                     {newstr[i]=word[0][j];j++;i++;};break;
            }
        }
    }
    return newstr;
}

PM MAIL   Вверх
t_gran
Дата 21.1.2010, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск

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



Цитата

word[i][j]='/0', не знаю почему?'

Да потому, что нужно писать '\0' а не '/0'.

И основная ошибка, это то, что функция возвращает указатель на массив, память из под которого освобождается по завершению вашей функции. Поэтому, чтобы сильно не заморачиваться с кодом, сделайте массив newstr статичным (static), тогда всё заработает.


--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
Luyan
Дата 21.1.2010, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Код

#include <stdio.h>
#include <conio.h>
#include <string.h>

char* function(char *str);
int main()
{
    char C[256] = {'a','a','a',' ','b','b','1','b','b',' ','c','c','2','c','c','\0'};
    printf ("Input words and numbers: \n");
    printf ("New string: %s", function(C));
    _getch();
    return 0;
}
char* function(char* str)
{
    char word[5][20];
    char newstr[256];
    int i=0,j=0,k=0;
    while(str[k] != '\0')
    {
        if(str[k] == ' ')
        {
            word[i][j] = '\0';
            i++;
        }    
        word[i][j] = str[k];         
       j++;k++;
    }
    i=0;j=0;k=0;int l=0;
    while(str[k] != '\0')
    {
        if(str[k] >= '1' && str[k] <= '5')
        {
            switch(str[k])
            {
                case '1':while (word[0][j] !='\0')
                     {newstr[i]=word[0][j];j++;i++;};break;
                case '2':while (word[1][j] !='\0')
                     {newstr[i]=word[1][j];j++;i++;};break;
                case '3':while (word[2][j] !='\0')
                     {newstr[i]=word[2][j];j++;i++;};break;
                case '4':while (word[3][j] !='\0')
                     {newstr[i]=word[3][j];j++;i++;};break;
                case '5':while (word[4][j] !='\0')
                     {newstr[i]=word[4][j];j++;i++;};break;
            }
            k++;j++;
        }
        else
        {
            newstr[i] = str[k];k++;i++;
        }
    }
    newstr[i] = '\0';
    return newstr;
}

поправил ваш код, в первом цикле немного не то делали, а во втором забыли 2 переменные инкрементировать.
PM   Вверх
maxnsk82
Дата 21.1.2010, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



заменил: char static newstr[256]; "/" на "\" тоже везде, но не выполняется программа - ввод массива происходит, enter: такое вот сообщение: Unhandled exception at 0x00fe1540 in prog_lr3v13.exe: 0xC0000005: Access violation reading location 0x0000fb57. кнопки: break- выход/continue-сообщение так и остаётся(
PM MAIL   Вверх
t_gran
Дата 21.1.2010, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск

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



Цитата

заменил: char static newstr[256];


Код

static char newstr[256];


И всё тогда нормально выполняется. Не верите, см. прикреплённый файл.

Это сообщение отредактировал(а) t_gran - 21.1.2010, 11:47

Присоединённый файл ( Кол-во скачиваний: 9 )
Присоединённый файл  prog_lr3v13.zip 3,17 Kb


--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
wasistdas
Дата 21.1.2010, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(t_gran @ 21.1.2010,  11:45)
И всё тогда нормально выполняется. Не верите, см. прикреплённый файл.

Ваш вариант не работает и не работает он не из-за static. 
К автору вопроса, ваша прога вылетает при чтение str, потому что:
Код

   while (str[k] != '/0')                //-----------
    {                                    //
        while (str[k] != ' ')            //    Записываем отдельные слова
        {                                //    в массив word
            word[i][j]=str[k];            //
            j++;k++;                    //
        }word[i][j]='/0';i++;k++;j=0;    //
    }     

тут мы пролетает с последним символом, нужно ставить проверку во втором цикле на конец строки

Рабочий вариант:
Код

# include <stdio.h>
# include <conio.h>
# include <string.h>

char* function(char *str);

int main()
{
    char C[256];
    printf ("Input words and numbers: \n");
    gets_s(C);
    printf ("New string: %s", function(C));
    _getch();
    return 0;
}
char* function(char* str)
{
    char word[5][20];
    char newstr[256];
    int i=0,k=0;
    for(k=0;str[k]!='\0';k++)               
    {          
        int j = k;
        for(;str[j] != ' ' && str[j] != '\0';j++)
        {                                
            word[i][j-k]=str[j];            
        }
        word[i][j-k]='\0';

        if(str[j]=='\0')
            break;
        else
        {
            if(j>k)
            {
                i++;
                k=j-1;
            }
        }
    }   

    i=0;;k=0;int l=0;
    while(str[k] != '\0')
    {
        if(str[k] >= '1' && str[k] <= '5')
        {
            int j = 0;
            switch(str[k])
            {
                case '1':while (word[0][j] !='\0')
                     {newstr[i]=word[0][j];j++;i++;};break;
                case '2':while (word[1][j] !='\0')
                     {newstr[i]=word[1][j];j++;i++;};break;
                case '3':while (word[2][j] !='\0')
                     {newstr[i]=word[2][j];j++;i++;};break;
                case '4':while (word[3][j] !='\0')
                     {newstr[i]=word[3][j];j++;i++;};break;
                case '5':while (word[4][j] !='\0')
                     {newstr[i]=word[4][j];j++;i++;};break;
            }
            k++;j++;
        }
        else
        {
            newstr[i] = str[k];k++;i++;
        }
    }
    newstr[i] = '\0';
    return newstr;
}


Такой вопрос, а почему цифр то 5?)) а не 10.И еще не должна ли здесь быть рекурсия ?, т.е. дано: ааа ббб1ввв ггг2ддд -> 3 строка по вашему методу будет гггббб1вввддд, по-хорошему еще 1 можно разложить.
PM MAIL   Вверх
Luyan
Дата 21.1.2010, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



я так смотрю, на мой рабочий исходник никто не посмотрел, все свои стали делать.  smile 
я же написал:
Цитата(Luyan @  21.1.2010,  11:32 Найти цитируемый пост)
в первом цикле немного не то делали

поэтому там и была ошибка. Я это исправил. Но хоть мой код рабочий, он не до конца верный, так как я начинал записывать второе слово в позицию word[1][4] и так далее, вариант wasistdas'а с первым циклом более правильный.
Цитата(wasistdas @  21.1.2010,  12:02 Найти цитируемый пост)
И еще не должна ли здесь быть рекурсия ?

думаю нет, смотри пример тс.
Цитата(maxnsk82 @  20.1.2010,  13:37 Найти цитируемый пост)
например, "aaa bb1bb cc2cc" - "aaa bbaaabb ccbb1bbcc"

PM   Вверх
maxnsk82
Дата 21.1.2010, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Всем спасибо!!!)  wasistdas - молодец) Рекурсия я думаю не нужна - ориентируясь по примеру. А то что чисел 5))..ну да в принципе не важно, вроде ещё есть время переправить до 9)...ещё раз спасибо! очень помогли!
PM MAIL   Вверх
Dancer
Дата 21.1.2010, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 29.4.2005
Где: Nizhniy Novgorod

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



а ничего, что в задании написано "число", а вы организуете замену по "цифрам"? (скорее всего вся фишка задания именно в этом)
в таком случае, только первые 10 слов будут вставляться в дальнейший текст.
хотя конечно, если написать aaa121bbb то что нужно будет в это случае сделать? 
(слово 121; 
слово 1, слово 21; 
слово 1, слово 2, слово 1;
слово 12, слово 1) критерий выбора будет не понятен тогда, и что вставлять вместо слова с несуществующим индексом?

Наверное просто в задании ошибка.


--------------------
У программистов есть великая тайна: всё, что только можно, было давно кем-то когда-то написано. Разработчику только нужно знать в какое место кода какие строчки вставить! smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

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

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


 




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


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

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