С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
Starternh
21 / 4 / 1
Регистрация: 29.05.2013
Сообщений: 81
1

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

24.04.2014, 22:22. Просмотров 2293. Ответов 16
Метки нет (Все метки)

Вообщем-то возникли трудности с решением кое-какой задачи. Не пойму как складывать строки или символы через циклы с использованием массивов. Например,
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" для этого, но дело в том, что так, как я пробую, не получается. Как можно сложить через циклы строки?
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.04.2014, 22:22
Ответы с готовыми решениями:

Как скопировать символы по позициям или по правилам со строки?
Здравствуйте, подскажите пожалуйста как мне скопировать символы одной строки по...

Сформировать строку S таким образом, чтобы в нее попеременно вошли четные символы строки S1 и нечетные символы строки S2.
Вот задание: Даны строки S1 и S2. Сформировать строку S таким образом, чтобы...

При вводе строки выввести символы через один
Я объявил i=i+2. По идеи при вводе строки, символы должны выводится через...

Удалить из строки все символы, не являющиеся буквами или цифрами
Дана строка символов. Преобразовать строку, удалив из нее все символы, не...

Как обрезать эффективно часть строки, составляющую последние символы "/" и следующие за ними символы?
здравствуйте, есть код, обрезающий во входной строке часть составляющую...

16
zss
Модератор
Эксперт С++
7485 / 6852 / 4326
Регистрация: 18.12.2011
Сообщений: 18,135
Завершенные тесты: 1
24.04.2014, 22:24 2
C++
1
2
3
char a[4]={'a',0};
char b[2]={'b',0};
strcat(a,b);
0
Starternh
21 / 4 / 1
Регистрация: 29.05.2013
Сообщений: 81
24.04.2014, 22:28  [ТС] 3
А как сделать через цикл? Суть в том, что мне нужно решить задачку по перебору всех возможных вариантов, а без цикла не обойтись. Если я пытаюсь сделать так как вы, то получается. Но если использую запись типа A[i], то так не получается(
0
zss
Модератор
Эксперт С++
7485 / 6852 / 4326
Регистрация: 18.12.2011
Сообщений: 18,135
Завершенные тесты: 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;
2
Меорн
76 / 61 / 45
Регистрация: 01.02.2014
Сообщений: 208
24.04.2014, 22:41 5
Лучший ответ Сообщение было отмечено Starternh как решение

Решение

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 был достаточен для хранения полученной строки.
1
Starternh
21 / 4 / 1
Регистрация: 29.05.2013
Сообщений: 81
24.04.2014, 22:53  [ТС] 6
Спасибо, вроде всё понял)
0
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;
}
0
Меорн
76 / 61 / 45
Регистрация: 01.02.2014
Сообщений: 208
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);
1
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;
}
0
Меорн
76 / 61 / 45
Регистрация: 01.02.2014
Сообщений: 208
10.06.2015, 00:16 10
Цитата Сообщение от colvern Посмотреть сообщение
Может нужно как-то дополнять \0, но как это явно сделать я не пока не знаю.
C
1
memset(text, 0, sizeof(char) * 4 * 21);
1
colvern
1 / 1 / 0
Регистрация: 08.06.2015
Сообщений: 13
10.06.2015, 00:39 11
Спасибо, всё получилось.
Си удивительный язык.
0
Меорн
10.06.2015, 09:12
  #12

Не по теме:

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

0
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);
0
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);
Иначе возникает утечка памяти.
0
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';
1
Меорн
12.06.2015, 19:25
  #16

Не по теме:


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

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

0
colvern
1 / 1 / 0
Регистрация: 08.06.2015
Сообщений: 13
12.06.2015, 19:57 17
Меорн,

Не по теме:

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

0
12.06.2015, 19:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.06.2015, 19:57

Написать функцию, которая удаляет из строки символы, не являющиеся буквами или цифрами
Написать функцию, которая удаляет из строки символы, не являющиеся буквами или...

Написать функцию, которая удаляет из строки символы, не являющиеся буквами или цифрами
Написать функцию, которая удаляет из строки символы, не являющиеся буквами или...

Как складывать строки/символы
Столкнулся с проблемой. Мне нужно передать через COM-порт строки вида: &quot;VOLM00 ...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru