Преобразование ввода из строчных в прописные с использованием кодов ASCII в C ++ - PullRequest
0 голосов
/ 18 октября 2018

Это мой первый вопрос, поэтому я сделал все возможное, чтобы этот вопрос был хорошим.

Я создаю программу, которая по существу принимает пользовательский ввод и преобразует все символы в верхний регистр.Я использую цикл for для поиска строчных букв с использованием соответствующих кодов ASCII.

Я могу сделать это просто отлично, используя массив символов, которому присваивается строковый код: char text[] = "Text".

Я хочу иметь возможность принимать пользовательский ввод и использовать его в массиве символов.Я попытался использовать getline(cin,myString) и присвоить массив символов этим, но он говорит, что массив должен быть инициализирован инициализатором в скобках.

Я сохранил массив символов неинициализированным, потому что sizeof (текст) не дает правильное значениеразмер при инициализации массива.Я читал об использовании указателей, но я все еще немного свеж в этой теме.Ниже приведен код, который я написал:

int main() {
    // User input as a string
    char textConvert[] = "This text will be converted to uppercase.";
    cout << textConvert << endl;
    int endChar = sizeof(textConvert); //Only gives correct size when array is uninitialized
    for (int i = 0; i < endChar; i++) {
        if (textConvert[i] >= 97 && textConvert[i] <= 122) {
            textConvert[i] = textConvert[i] - 32;
        }
    }
    cout << textConvert;
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Вопрос:

Я попытался использовать getline (cin, myString) и присвоить ему массив символов, но он говорит, что массив должен быть инициализирован инициализатором в скобках

Здесь компилятор определяет размер необходимого массива.

    char textConvert[] = "This text will be converted to uppercase.";

Если вы хотите, чтобы пользователь вводил данные, вам нужно выделить массив и указать размер.

    char textConvert[50];

Теперь вы можетепрочитайте строку и скопируйте ее в массив:

    std::string myString;
    std::getline(std::cin , myString);
    // Should check that the string is not more than 50 characters.
    std::copy(std::begin(myString), std::end(myString), textConvert);

Но на самом деле это вообще не нужно.Просто используйте std::string и зациклите строку.Лучше всего избегать конструкций C, таких как массивы, и использовать конструкции C ++, которые останавливают ваши ошибки.

Размер строки

Это не очень хорошая идея.

    int endChar = sizeof(textConvert);

Этоизмеряет размер массива (не размер строки).Существует также проблема, заключающаяся в том, что массивы очень легко распадутся на указатели.Когда это происходит, sizeof() даст вам размер указателя (возможно, 4 или 8), а не размер массива.

Чтобы получить размер строки, используйте std::strlen() (include <cstring>).

Но на самом деле вы должны использовать std::string версию C ++ строки, которая выполняет собственное управление памятью и изменяет размеры по мере необходимости.

Магические числа

Предпочитают неиспользуйте магические числа:

        if (textConvert[i] >= 97 && textConvert[i] <= 122) {
            textConvert[i] = textConvert[i] - 32;
        }

Эти магические числа затрудняют чтение кода.Вместо этого вы можете использовать символьные константы.

        if (textConvert[i] >= 'a' && textConvert[i] <= 'z') {
            textConvert[i] = textConvert[i] - ('a' - 'A');
        }

Предпочитать стандартную библиотеку

Но делать это вручную не рекомендуется.Вы должны использовать стандартные библиотечные процедуры.

std::islower() .  // Check if a character is lower case.
std::toupper() .  // Convert a lowercase character to upper.

// include <cctype>

C ++ Пример

Попробуйте это:

#include <iostream>
#include <string>
#include <cctype>

int main()
{
    std::string   myString;
    while(std::getline(std::cin, myString)) {
        std::cout << "User Input: " << myString << "\n";
        for(auto& c: myString) {
            c = std::toupper(c);
        }
        std::cout << "Upper Case: " << myString << "\n";
    }
}
0 голосов
/ 18 октября 2018

Поскольку вы имеете дело с ASCII, вы можете просто использовать std :: toupper .

Нет необходимости писать собственный код, чтобы сделать это, стандартная библиотека покрыла вас.

...