Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C]Решение задачи "2 Stringa в 1"


Автор: dima6920 14.4.2010, 16:01
Привет всем!
Помогите пожалуйста с задачкой-застрял на этом уже второй день.

Суть задачи заключается:
Есть 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();
}


Заранее благодарен

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

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

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

вообще-то есть функция strlen, которая сама определяет длину строки

Автор: SaNioK 14.4.2010, 16:45
Да и для конкатенации строк также есть свои функции 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();
}

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

в данном случае они не помогут, из-за нулевого символа.
вот mempcy пойдет.

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

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

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

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

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

Автор: Dancer 14.4.2010, 17:49
если нужно вкатить всё, включая \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);


Автор: ИванМ 14.4.2010, 18:47
Если нужен велосипед, то вот:

Код

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);
}

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

Собственно в gcc я немного менял и все отлично работало, можете уточнить почему не подойдет?

Автор: ИванМ 14.4.2010, 21:17
SaNioK, теперь уже подойдут, когда автор сказал, что он ошибся.
А так strcat прибавляет строку, убирая нулевой символ исходной. Поэтому если нужно нулевой символ оставить, то strcat не подходит. Я это имел ввиду.

Автор: SaNioK 15.4.2010, 00:59
ИванМ
А как тогда будет выведена строка?
Ведь, насколько я помню, функции вывода - выводят строку до символа окончания строки '\0' - я прав?
Т.е. это сугубо "лабораторная" smile  задача.

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)