Я пишу программу под названием «Зума». Программа работает следующим образом.Как изменить строку на массив символов в C/C++?
Input:
ACCBA // a string make up of char from 'A' to 'Z'
5 // number of inputs
1 B // insert char 'B' to position '1' of the string
0 A // and so on...
2 B
4 C
0 A
Когда 3 одинаковых символа рядом друг с другом, мы удаляем/удаляем/удаляем их из строки.
Например, когда мы вставляем символ 'C' в позицию 2 строки 'ABCC', мы получаем 'AB', потому что 'CCC' удаляются из строки.
Output:
ABCCBA
AABCCBA
AABBCCBA // the process is AABBCCCBA -> AABBBA -> AAA -> -
- // if the string is empty, we output "-"
A
Это мой код шпагатом:
#include <iostream>
using namespace std;
int main()
{
int n, pos;
int k = 0;
int length = 0;
string zuma, marble; // i use string
cin >> zuma;
cin >> n;
for (int i = 0; i < n; ++i)
{
cin >> pos >> marble;
zuma.insert(pos, marble);
length = zuma.length(); // length of current string
// compare each char from pos[i] with pos[i+1] and pos[i+2]
// and then ++i until end of string
while (k != length && length >= 3)
{
if (zuma[k] == zuma[k + 1] && zuma[k] == zuma[k + 2])
{
zuma.erase(k, 3); // erase 3 same char in the string
k = 0; // set k to zero to start from pos[0] again
}
else
k++;
}
// if string is not empty
if (!zuma.empty())
{
cout << zuma << endl; // output the current char in the string
k = 0;
}
else
cout << "-" << endl;
}
return 0;
}
Это мой код с массив символов:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
void append (char subject[], const char insert[], int pos) {
char buf[100] = {};
strncpy(buf, subject, pos);
int len = strlen(buf);
strcpy(buf+len, insert);
len += strlen(insert);
strcpy(buf+len, subject+pos);
strcpy(subject, buf);
}
int main()
{
int n, pos;
int k = 0;
int length = 0;
char zuma[100], marble[100];
scanf("%s", zuma);
scanf("%d", &n);
for (int i = 0; i < n; ++i)
{
scanf("%d %s", &pos, marble);
append(zuma, marble, pos); // acts like string::insert
length = strlen(zuma);
while (k != length && length >= 3)
{
if (zuma[k] == zuma[k + 1] && zuma[k] == zuma[k + 2])
{
//zuma.erase(k, 3); // need help with this part to remove 3 same chars like string::erase
k = 0;
}
else
k++;
}
if (strlen(zuma) != 0)
{
printf("%s\n", zuma);
k = 0;
}
else
printf("%s\n","-");
}
return 0;
}
Моя проблема заключается в том, как написать функцию, чтобы удалить 3 же символов просто как будто строка :: erase do?
Спасибо за помощь!
Чтобы уточнить: Вы хотите сделать с массивами символов то, что вы уже можете делать со строками, более ясным, безопасным и более сжатым способом? И, кстати, ваше строковое решение, скорее всего, сработает, если 'k' достигает' length() - 2', потому что предложение if будет обращаться к символам за пределами длины строки. – Kolja
@Kolja Да, я хочу сделать это с массивами char, поскольку scanf имеет проблемы со строкой (corrent me, если я ошибаюсь), потому что мой друг сказал мне, что scanf быстрее, чем cin. – warofglory
Я не думаю, что это хорошая причина использовать функции C, если вы работаете с C++. Если действительно существует разница в скорости (что возможно), действительно ли имеет значение, если вы работаете только с несколькими символами (пользовательского ввода, который вводит латентности намного выше того, что вы бы измеряли в цикле процессора, потому что, ну, вы ожидая пользователя)? Пойдите для 'std :: cin'. Вы могли бы даже поменять его позже и по-прежнему работать со строками большую часть времени, если вам действительно нужно. Если вы все еще хотите использовать 'scanf', см. Ответ Виммэля, он делает то, что вы хотите. – Kolja