2014-10-11 3 views
-1

Я пишу программу под названием «Зума». Программа работает следующим образом.Как изменить строку на массив символов в 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?

Спасибо за помощь!

+0

Чтобы уточнить: Вы хотите сделать с массивами символов то, что вы уже можете делать со строками, более ясным, безопасным и более сжатым способом? И, кстати, ваше строковое решение, скорее всего, сработает, если 'k' достигает' length() - 2', потому что предложение if будет обращаться к символам за пределами длины строки. – Kolja

+0

@Kolja Да, я хочу сделать это с массивами char, поскольку scanf имеет проблемы со строкой (corrent me, если я ошибаюсь), потому что мой друг сказал мне, что scanf быстрее, чем cin. – warofglory

+1

Я не думаю, что это хорошая причина использовать функции C, если вы работаете с C++. Если действительно существует разница в скорости (что возможно), действительно ли имеет значение, если вы работаете только с несколькими символами (пользовательского ввода, который вводит латентности намного выше того, что вы бы измеряли в цикле процессора, потому что, ну, вы ожидая пользователя)? Пойдите для 'std :: cin'. Вы могли бы даже поменять его позже и по-прежнему работать со строками большую часть времени, если вам действительно нужно. Если вы все еще хотите использовать 'scanf', см. Ответ Виммэля, он делает то, что вы хотите. – Kolja

ответ

1

Вы можете использовать memmove, чтобы скопировать оставшуюся часть строки в положение символов для удаления. Используйте strlen, чтобы определить, сколько байтов нужно переместить. Обратите внимание: вы не можете использовать strcpy, потому что исходные и целевые буферы перекрываются.

if (zuma[k] == zuma[k + 1] && zuma[k] == zuma[k + 2]) 
{ 
    int len = strlen(zuma+k+3) + 1; // +1 to copy '\0' too 
    memmove(zuma+k, zuma+k+3, len); 
    k = 0; 
} 
+1

Спасибо, это сработало! – warofglory

Смежные вопросы