C++ - Самый простой способ преобразовать возможные числовые значения в массиве ASCII-символов в символы

Какой самый простой способ подсчитать массив символов как значения ASCII и, если он содержит числовые значения, преобразовать их в char и показать их как char массив, а не значения? Такой вклад может быть 1003297 выход будет d a, какой самый простой и легкий способ сделать это?

На самом деле, я пытаюсь решить проблему UVa 444 - Encoder Decoder. Я сделал половину этого. Но проблема в том, что я не могу преобразовать int ввод числа в char массив.

Мне удалось преобразовать символы в их значения ASCII и обратить все значения ASCII и показать их, перевернув весь массив, но, наоборот, я не смог этого сделать и застрял здесь три дня и продолжил поиск. Я принимаю участие char массив, так что если я возьму числовые значения, он будет также принят как символ, но мне нужно сохранить все числовые значения в int массив и предполагая, что все эти числа являются значениями ASCII, мне нужно показать, что char значения для этого int массив через char массив. И еще одна вещь, что ограничение по времени 3 второй. Я знаю, что он большой, но мне нужен самый простой и простой способ сделать это.


Это мое неполное решение:

#include <iostream>
#include <cstring>
#include <string.h>
#include <cstdlib>
using namespace std;

int main()
{
    char str [80];
    int arr [80];
    char intStr[80];
    int b;
    string a, finale;

    cout << "Your String : ";
    cin.getline( str, 80, '\n' );

    for(int i = 0; i < strlen(str); i++)
    {
        if(str[0] < 48 || str[0] > 57 || str[i] == 32 && str[i] != 13 )
        {
            arr[i] = str[i];
            b = i;
        }
        else if(str[0] > 48 && str[0] < 57)
        {
            arr[i] = str[i];
            b = i;
            goto encode;
        }
    }

    decode:

    for(int j = b; j >= 0; j--)
    {
        itoa(arr[j], intStr, 10);
        a = a + strrev(intStr);
    }
    cout << a;

    encode:

    for(int j = b; j > 0; j--)
    {
        //itoa(arr[j], intStr, 10);
        atoi(arr[j]);
        a = a + strrev(intStr);
    }
    cout << a;

    return 0;
}

1 ответ

Решение

Конечно, это можно сделать проще...

Во-первых, использование необработанных символьных массивов в C++ должно быть зарезервировано для операций низкого уровня. Здесь вы просто обрабатываете входную строку, поэтому она должна быть простой std::string,

Тогда правильным способом будет накапливать входные десятичные цифры до тех пор, пока вы не достигнете приемлемого кода ASCII, а когда вы его получите, вы добавите его в конец вашей выходной строки.

Наконец, построение строки по одному символу за раз неэффективно: сначала вы должны собрать все в std::vector и только в конце постройте строку. Код может быть таким простым:

#include <iostream>
#include <string>
#include <vector>

using namespace std;
int main()
{
    string line;            // input line
    vector<char> out;       // gather converted characters
    char res = 0;           // to compute the ascii values
    std::getline(cin, line);
    for (char c: line) {
        if (c >= '0' && c <= '9') {         // only process decimal digits
            res = 10 * res + (c - '0');
            if (res >= ' ') {               // Ok, we have a valid ASCII code
                out.push_back(res);
                res = 0;
            }
        }
        else if (res != 0) {                // assume that non numeric act as separators
            out.push_back(res);             // whatever the input value (allows control chars)
            res = 0;
        }
    }
    string a(out.begin(), out.end());       // build a string from the vector
    cout << a << endl;
    return 0;

}
Другие вопросы по тегам