Форум программистов, компьютерный форум CyberForum.ru

Как складывать строки или символы через циклы с использованием массивов - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Starternh
18 / 1 / 0
Регистрация: 29.05.2013
Сообщений: 60
24.04.2014, 22:22     Как складывать строки или символы через циклы с использованием массивов #1
Вообщем-то возникли трудности с решением кое-какой задачи. Не пойму как складывать строки или символы через циклы с использованием массивов. Например,
C++
1
2
3
4
5
6
7
8
9
10
char a[2]={'a'};
char b[2]={'b'};
        for(int i(0);i<3;i++)
        {
            strcat(a[i],b[i]);
            cout<<a;
        }
        
    getch();
    return 0;
я хочу сложить символы а и b через массив. Не знаю правильно ли я выбрал "strcat" для этого, но дело в том, что так, как я пробую, не получается. Как можно сложить через циклы строки?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.04.2014, 22:22     Как складывать строки или символы через циклы с использованием массивов
Посмотрите здесь:

Массив массивов или как ? C++
Как удалить из строки ненужные символы? C++
C++ Сформировать строку S таким образом, чтобы в нее попеременно вошли четные символы строки S1 и нечетные символы строки S2.
C++ Определить число вхождений в строку подстроки "аба", вывести символы строки, не являющейся буквами или цифрами
C++ Как взять символы из строки до пробела?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,155
Завершенные тесты: 1
24.04.2014, 22:24     Как складывать строки или символы через циклы с использованием массивов #2
C++
1
2
3
char a[4]={'a',0};
char b[2]={'b',0};
strcat(a,b);
Starternh
18 / 1 / 0
Регистрация: 29.05.2013
Сообщений: 60
24.04.2014, 22:28  [ТС]     Как складывать строки или символы через циклы с использованием массивов #3
А как сделать через цикл? Суть в том, что мне нужно решить задачку по перебору всех возможных вариантов, а без цикла не обойтись. Если я пытаюсь сделать так как вы, то получается. Но если использую запись типа A[i], то так не получается(
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,155
Завершенные тесты: 1
24.04.2014, 22:38     Как складывать строки или символы через циклы с использованием массивов #4
C++
1
2
3
4
5
char a[100]={'a','a',0};
char b[2]={'b','c','d','e',0};
for(int i=0;i<4;i++)
  a[i+2]=b[i]; // двойка - длина начальной строки в a
a[i+2]=0;
Меорн
74 / 59 / 29
Регистрация: 01.02.2014
Сообщений: 201
24.04.2014, 22:41     Как складывать строки или символы через циклы с использованием массивов #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int main()
{
    char a[4]={'a'};
    char b[4]={'b'};
    for(int i = 0; i < strlen(b); i++)
    {
        strcat(a,&b[i]);
        cout<<a;
    }
 
    getch();
    return 0;
}
только не забывай следить что бы размер массива a был достаточен для хранения полученной строки.
Starternh
18 / 1 / 0
Регистрация: 29.05.2013
Сообщений: 60
24.04.2014, 22:53  [ТС]     Как складывать строки или символы через циклы с использованием массивов #6
Спасибо, вроде всё понял)
colvern
1 / 1 / 0
Регистрация: 08.06.2015
Сообщений: 13
08.06.2015, 22:55     Как складывать строки или символы через циклы с использованием массивов #7
Изучаю Си и попутно пишу программу для микроконтроллера.
В бесконечном цикле while в переменную sym записывается некоторый символ полученный через getChar().
Далее происходит конкатенация переменной text и sym, после чего значение выводится на дисплей.
По замыслу в переменной text должна накапливаться строка из поступающих символов, но по факту этого не происходит и всё время выводится строка "some text " + последний поступивший символ из переменной sym.
Как сделать так, чтобы в переменной text накапливался и выводился текст из поступающих символов?

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int main(void)
{
    char sym;
    char *text;
    char *text_2;
    
        text = "some text ";
        text_2 = "";
  
        while(1){
            sym = getChar(); 
            if (sym){ 
                *text_2 = sym; 
            strcat(text, text_2);
            SendString(text);
            }
         }
  return 0;
}
Меорн
74 / 59 / 29
Регистрация: 01.02.2014
Сообщений: 201
09.06.2015, 00:31     Как складывать строки или символы через циклы с использованием массивов #8
Думаю нельзя записывать в область памяти где хранятся литералы. Если используете С-строки, то выделяйте под них память.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main(void)
{
    char text[256];
    char text_2[2] = "\0";
 
    strcpy(text, "sometext");
 
    while(1){
        if ((text_2[0] = getchar()) != '\n'){ 
            strcat(text, text_2);
            printf(text, '\n');
        }
    }
    return 0;
}
Добавлено через 14 минут
Или так:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main(void)
{
    char* text = (char*)calloc(256, sizeof(char));
    char* text_2 = (char*)calloc(2, sizeof(char));
 
    strcpy(text, "sometext");
 
    while(1){
        if ((text_2[0] = getchar()) != '\n'){ 
            strcat(text, text_2);
            printf(text, '\n');
        }
    }
    return 0;
}
Добавлено через 5 минут
И не забывайте что С-строки должны заканчиваться нулем. Функция strcat будет копировать все содержимое памяти пока не встретит ноль. Поэтому нельзя писать:
C
1
2
3
4
            sym = getChar(); 
            if (sym){ 
                *text_2 = sym; 
            strcat(text, text_2);
colvern
1 / 1 / 0
Регистрация: 08.06.2015
Сообщений: 13
09.06.2015, 22:58     Как складывать строки или символы через циклы с использованием массивов #9
Благодарю, разобрался.
Теперь всё работает как надо.

Добавлено через 2 часа 11 минут
Решил усложнить задачу и хранить в двумерном массиве text 4 строки графического индикатора по 20 символов в каждой, чтобы организовать перелистывание, но вот как работать с таким массивом что-то никак не пойму. Программа компилируется без ошибок, но не работает. Может нужно как-то дополнять \0, но как это явно сделать я не пока не знаю.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
int main(void)
{
    
    char text[4][21];
    char sym[2] = "\0";
    int line = 0;
    int pos = 0;
          
    while(1){
        
        if ((sym[0] = getChar())){
 
            strcat(text[line], sym);    
 
            sendString(0, line, text[line]);    
            
            pos++;
            if(pos > 19){
                pos = 0;
                line++;
            }
        }
    }
    
    return 0;
}
Меорн
74 / 59 / 29
Регистрация: 01.02.2014
Сообщений: 201
10.06.2015, 00:16     Как складывать строки или символы через циклы с использованием массивов #10
Цитата Сообщение от colvern Посмотреть сообщение
Может нужно как-то дополнять \0, но как это явно сделать я не пока не знаю.
C
1
memset(text, 0, sizeof(char) * 4 * 21);
colvern
1 / 1 / 0
Регистрация: 08.06.2015
Сообщений: 13
10.06.2015, 00:39     Как складывать строки или символы через циклы с использованием массивов #11
Спасибо, всё получилось.
Си удивительный язык.
Меорн
10.06.2015, 09:12
  #12

Не по теме:

Как по мне, так C++ гораздо удивительнее...

Bertul
Заблокирован
10.06.2015, 09:47     Как складывать строки или символы через циклы с использованием массивов #13
C++
1
2
3
4
char a[2] = { 'a','b' };
    char b[2] = { 'b','b' };
 
    cout << string(a, 2) << string(b, 2);
colvern
1 / 1 / 0
Регистрация: 08.06.2015
Сообщений: 13
10.06.2015, 22:22     Как складывать строки или символы через циклы с использованием массивов #14
Приключения со строками продолжаются.
При возникновении некоторого повторяющегося события нужно обрезать строку text[line] находящуюся в массиве строк на один символ и сохранять в том же элементе массива. Код ниже правильно работает только один раз, т.е. при повторном вызове длина text[line] остается неизменной. В чем моя ошибка?
C
1
2
3
4
5
6
7
8
9
10
// объявление переменных
char text[4][21];
memset(text, 0, sizeof(char) * 4 * 21);
char t[21] = "\0";
 
//код, выполняющийся при возникновении события
strncpy(t, text[line], strlen(text[line]) - 1);         
strcat(t, "\0");
strcpy(text[line], t);
//..............
Добавлено через 40 минут
Нашел вот такое рабочее решение:
C
1
2
3
4
5
6
7
8
9
char *substr(const char *baseStr, size_t startPos, size_t len)
{
    char *result = (char *)malloc(len + 1);
    strncpy(result, baseStr + startPos, len);
    result[len] = '\0';
    return result;
}
 
strcpy(text[line], substr(text[line], 0, pos - 1));
Добавлено через 1 час 22 минуты
Применять этот substr нужно правильно вот так:
C
1
2
3
4
char *t;
t = substr(text[line], 0, pos);
strcpy(text[line], t);
free(t);
Иначе возникает утечка памяти.
colvern
1 / 1 / 0
Регистрация: 08.06.2015
Сообщений: 13
12.06.2015, 18:44     Как складывать строки или символы через циклы с использованием массивов #15
Более простой способ укорачивания строки
C
1
2
3
int n = 1; // на сколько символов укоротить
l = strlen(text);                   
text[l-n] = '\0';
Меорн
12.06.2015, 19:25
  #16

Не по теме:


И все-таки C++ нагляднее:

C++
1
2
3
std::string str = "блаблабла"
int n = 1;
str.resize(str.length() - n);
И память сама добавляется/удаляется. А главное ломать голову не нужно, что да как. Все уже есть готовое...
А для микроконтроллеров только на C можно писать?

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.06.2015, 19:57     Как складывать строки или символы через циклы с использованием массивов
Еще ссылки по теме:

Как описывать множества, пересекать их, складывать C++
Как скопировать символы по позициям или по правилам со строки? C++
Как отбросить последние символы строки C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
colvern
1 / 1 / 0
Регистрация: 08.06.2015
Сообщений: 13
12.06.2015, 19:57     Как складывать строки или символы через циклы с использованием массивов #17
Меорн,

Не по теме:

на C++ тоже можно, но я решил начать с основ. К тому же, как мне объяснили, с++ более актуален для ООП, а в приложениях для контроллеров таких задач, как правило, нет. В общем, как я понимаю перейти на с++ не очень сложно, если что. Да и в Си я уже начал осваиваться, того дискомфорта, который был в начале уже нет.

Yandex
Объявления
12.06.2015, 19:57     Как складывать строки или символы через циклы с использованием массивов
Ответ Создать тему
Опции темы

Текущее время: 11:28. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru