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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C]Решение задачи "2 Stringa в 1" 
:(
    Опции темы
dima6920
Дата 14.4.2010, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Привет всем!
Помогите пожалуйста с задачкой-застрял на этом уже второй день.

Суть задачи заключается:
Есть 2 Стринга -first[10] и second[10]

Данные из этих двух Стрингов нужно переместить в третий third[22] поочередно то есть,сначала из первого в третий а потом из второго в третий вместе с '\0' (NULL).

Вот чего я наваял:
Код

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

void main()
{
    char first[10];
    char second[10];
    char third[22];
    int leg_first;
    int leg_second;
    int i;
    int j;
    int count=1;
    
    printf("Enter text for first string-(max 10 char):\n");
    gets(first);

    printf("Enter text for second string-(max 10 char):\n");
    gets(second);

    for(leg_first=0;first[leg_first]!='\0';leg_first++);                         //Считаем длину данных первого стринга
    for(leg_second=0;second[leg_second]!='\0';leg_second++);    //Считаем длину данных второго стринга        
    
    count=leg_first+leg_second;                 //Считаем длину данных 2 вместе взятых стрингов

    for(i=0,j=leg_second;i>count;i++,j++)   //Вот здесь и проблема
            {
                third[i]=first[i];
            third[j]=first[j];
                 }
    puts(third);
    getch();
}


Заранее благодарен
PM MAIL   Вверх
SaNioK
Дата 14.4.2010, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Странно... Задача так и стоит или ты что-то напутал?
Дело в том что '\0' обозначает конец строки в char, т.е. два '\0' в одном char не может быть. Но пойдем от обратного, строка выводится до того как не будет найден '\0' = вывод даже если ты наколдуешь и поместишь два '\0' в одну строку то выведется только первая часть) Но как я уже говорил реализовать это невозможно.

Но это все мои рассуждения - мб профи меня помидорами закидают. smile
PM MAIL   Вверх
ИванМ
Дата 14.4.2010, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

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



Цитата(dima6920 @  14.4.2010,  16:01 Найти цитируемый пост)
for(leg_first=0;first[leg_first]!='\0';leg_first++);  

вообще-то есть функция strlen, которая сама определяет длину строки
PM MAIL   Вверх
SaNioK
Дата 14.4.2010, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Да и для конкатенации строк также есть свои функции strcpy, strcat и т.д.)
используется библиотека string.h

Собственно 
Код

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

void main() {
    char first[10];
    char second[10];
    char third[22];
    
    printf("Enter text for first string-(max 10 char):\n");
    gets(first);
    printf("Enter text for second string-(max 10 char):\n");
    gets(second);
    
    strcpy(third, first);
    strcat(third, second);
    
    puts(third);
    getch();
}

PM MAIL   Вверх
ИванМ
Дата 14.4.2010, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

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



Цитата(SaNioK @  14.4.2010,  16:45 Найти цитируемый пост)
Да и для конкатенации строк также есть свои функции strcpy, strcat и т.д.)

в данном случае они не помогут, из-за нулевого символа.
вот mempcy пойдет.
PM MAIL   Вверх
dima6920
Дата 14.4.2010, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Да,насчет функций я уже вкурсе
Просят опять изобрести велосипед smile

Добавлено через 14 минут и 25 секунд
Цитата(SaNioK @ 14.4.2010,  16:19)
Странно... Задача так и стоит или ты что-то напутал?
Дело в том что '\0' обозначает конец строки в char, т.е. два '\0' в одном char не может быть. Но пойдем от обратного, строка выводится до того как не будет найден '\0' = вывод даже если ты наколдуешь и поместишь два '\0' в одну строку то выведется только первая часть) Но как я уже говорил реализовать это невозможно.

Но это все мои рассуждения - мб профи меня помидорами закидают. smile

Ты прав,из первого стринга нужны данные без '\0' а в продолжение этих данных добавляем второй стринг с данными + '\0' в конце

Последний цикл for скорей всего неправильный у меня....

Это сообщение отредактировал(а) dima6920 - 14.4.2010, 17:44
PM MAIL   Вверх
Dancer
Дата 14.4.2010, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



если нужно вкатить всё, включая \0
Код

#define LEN 10
....
    char first[LEN];
    char second[LEN];
    char third[(LEN+1)*2];
.....
    memcpy(third, first, LEN+1);
    memcpy(third + LEN+1, second, LEN+1);
....


если нужно склеить:
Код

    int first_len = strlen(first);
    int second_len = strlen(second);

    memcpy(third, first, first_len);
    memcpy(third + first_len, second, second_len);




--------------------
У программистов есть великая тайна: всё, что только можно, было давно кем-то когда-то написано. Разработчику только нужно знать в какое место кода какие строчки вставить! smile
PM MAIL   Вверх
ИванМ
Дата 14.4.2010, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

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



Если нужен велосипед, то вот:

Код

size_t len(char *s1)
{
    size_t n=0;
    for(;*s1;++s1,++n);
    return n;
}

void copy(char *dest, char *src)
{
    for(;(*dest)=(*src);++src,++dest);
}

void concat(char *s1, char *s2, char *out)
{
    copy(out, s1);
    copy(out+len(s1), s2);
}

PM MAIL   Вверх
SaNioK
Дата 14.4.2010, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(ИванМ @ 14.4.2010,  17:01)
в данном случае они не помогут, из-за нулевого символа.
вот mempcy пойдет.

Собственно в gcc я немного менял и все отлично работало, можете уточнить почему не подойдет?
PM MAIL   Вверх
ИванМ
Дата 14.4.2010, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

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



SaNioK, теперь уже подойдут, когда автор сказал, что он ошибся.
А так strcat прибавляет строку, убирая нулевой символ исходной. Поэтому если нужно нулевой символ оставить, то strcat не подходит. Я это имел ввиду.
PM MAIL   Вверх
SaNioK
Дата 15.4.2010, 00:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



ИванМ
А как тогда будет выведена строка?
Ведь, насколько я помню, функции вывода - выводят строку до символа окончания строки '\0' - я прав?
Т.е. это сугубо "лабораторная" smile  задача.
PM MAIL   Вверх
ИванМ
Дата 15.4.2010, 01:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

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



Цитата(SaNioK @  15.4.2010,  00:59 Найти цитируемый пост)
А как тогда будет выведена строка?
Ведь, насколько я помню, функции вывода - выводят строку до символа окончания строки '\0' - я прав?

Все правильно. Просто dima6920 сначала неправильно выразил задачу.
Но, например, в WinApi (например, работа с диалогами) используется строка, в которой слова разделяются нулевым символом, а в конце стоит два нулевых символа. Она, правда, нигде не выводится, но факт в том, что такая строка имеет право на существование. И опять таки в WinApi существуют функции, которые могут выводить строку с нулевым символом посередине, там вместо нулевого символа на конце задается размер строки.
Хотя не знаю, может, вы это все знаете. На всякий случай написал.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

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


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

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

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

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


 




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


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

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