Получение ввода X / X / etc с символом X и разделение его косой чертой / - PullRequest
0 голосов
/ 01 сентября 2018

Я делаю сборку программ с C ++. Моя программа конвертировать двоичные в десятичные и десятичные в алфавит. Вход разделен косой чертой "/"

пример ввода:

ввод: 00001/00010/00011

вывод: abc

это мой код

#include <iostream>
#include <conio.h>
#include <cstring>

using namespace std;
int main()
{
char X[64];
int T,d=0,i=0,j;
scanf("%[^/]/%d", X);
while(X[i]!=0)
{    if(X[i]=='0'||X[i]=='1')
    {
        d=d*2+X[i]-48;
    }i++;
}
switch (d)
{
    case 1:
        cout<<"a";
        break;
    case 2:
        cout<<"b";
        break;
    case 3:
        cout<<"c";
        break;
    case 4:
        cout<<"d";
        break;
    case 5:
        cout<<"e";
        break;
    case 6:
        cout<<"f";
        break;
    case 7:
        cout<<"g";
        break;
    case 8:
        cout<<"h";
        break;
    case 9:
        cout<<"i";
        break;
    case 10:
        cout<<"j";
        break;
    case 11:
        cout<<"k";
        break;
    case 12:
        cout<<"l";
        break;
    case 13:
        cout<<"m";
        break;
    case 14:
        cout<<"n";
        break;
    case 15:
        cout<<"o";
        break;
    case 16:
        cout<<"p";
        break;
    case 17:
        cout<<"q";
        break;
    case 18:
        cout<<"r";
        break;
    case 19:
        cout<<"s";
        break;
    case 20:
        cout<<"t";
        break;
    case 21:
        cout<<"u";
        break;
    case 22:
        cout<<"v";
        break;
    case 23:
        cout<<"w";
        break;
    case 24:
        cout<<"x";
        break;
    case 25:
        cout<<"y";
        break;
    case 26:
        cout<<"z";
        break;
}
cout << endl;
}

Я использовал несколько способов, которые все еще невозможны, и только передний двоичный файл может быть прочитан. Извините за мой плохой английский

Ответы [ 2 ]

0 голосов
/ 01 сентября 2018

Есть две неотложные проблемы, которые нужно решить:

scanf("%[^/]/%d", X);

Как написано, это будет демонстрировать неопределенное поведение, так как он попытается проанализировать первую строку в X, затем он читает '/', который разделяет, но затем он будет читать следующий набор цифр как номер без переменной для их хранения. Я бы посоветовал избавиться от конечного %d в строке спецификатора формата.

Вам также следует проверить возвращаемое значение scanf(), так как оно сообщит вам, сколько значений было проанализировано. Знание этого очень аккуратно ведет к решению главной проблемы: почему он обрабатывает только первое число?

Это потому, что вы вызываете scanf() один раз, читаете номер, обрабатываете его, выводите результат, а затем прекращаете выполнение.

Что вам нужно сделать, это заключить большую часть кода в цикл while и использовать следующую строку в качестве условия проверки цикла:

while (scanf("%[^/]/", X) == 1)

Это убивает двух зайцев одним выстрелом: он правильно проанализирует следующий набор цифр и войдет в цикл, если найдет что-нибудь, а если ничего нет, он должен вернуть 0, что приведет к прекращению цикла.

0 голосов
/ 01 сентября 2018
#include <iostream>
#include <string>
#include <sstream>

template< typename T, std::size_t N >
std::size_t sizeof_array(T (&)[N]) { return N; }

int main()
{
    std::string str;
    std::getline(std::cin, str);

    int number[3]{};
    std::size_t pos;
    auto start = str.data();

    for (std::size_t i{}; i < sizeof_array(number); ++i) {
        number[i] = std::stoi(start, &pos, 2);
        start += pos + 1;
    }

    for (auto n : number)
        std::cout << static_cast<char>('A' + n - 1);
    std::cout.put('\n');
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...