как получить массив символов для печати в одну строку, а не несколько в с ++? - PullRequest
0 голосов
/ 18 июня 2020

Как распечатать массив символов (msg) в c ++? Мой вывод печатает слова, которые я зашифровал, в разных строках вместо одной. Кроме того, «Введите строку текста или« готово »» в конечном итоге повторяется. Я предположил, что это из-за пробела между словами. Как это исправить? Любое предложение было бы полезным!

int main()
{
    ofstream outputFile;
    string fileName; //initiate variables
    char msg[100]; 
    int i;
    std::cout<< "Enter file name to encrypt: "; //get file name from user
    std::cin >> fileName; //save file name 
    outputFile.open(fileName);
    while(true){
    std::cout<< "Enter a line of text or '" << "done" << "' to quit: "; //get line of text from user
    std::cin>> msg; //send line of text to message array 
        if (msg[0] == 'd' && msg[1] == 'o' && msg[2] == 'n' && msg[3] == 'e'){//check if done is input
            break; //if done is entered, break program
        }
        else{
            for(i = 0; (i < 100 && msg[i] != '\0'); i++){ //loops thru encrypting each letter
                msg[i] = msg[i] + 1; //encrypt text 
            }
            outputFile << msg << endl; //send encrypted string/message to file from user
            std::cout << "Encrypted message: " << msg << endl; //print encrypted text to screen
        }
   }
    outputFile.close(); //close file
    return 0;
}

1 Ответ

0 голосов
/ 19 июня 2020

Ваш код использует operator>> для получения пользовательского ввода. Это функция ввода с форматированием слов. Он пропускает начальные пробелы, а затем извлекает последовательность непробельных символов. То есть извлекает следующее слово ввода. Получив следующее слово, вы обрабатываете его, начинаете новую строку вывода, запрашиваете у пользователя дополнительные данные, а затем повторяете. Когда в каждой строке больше слова, компьютер не ждет дополнительных вводов (несмотря на приглашение), и вы видите результат, который вы описываете.

Поскольку вы ищете строку ввода, вам следует использовать API, который получает всю строку ввода вместо одного слова. Готовы к удивительному названию этого API? Он называется getline(), или, точнее, std::istream::getline, поскольку вы застряли с использованием символьных массивов вместо строк.

std::cin.getline(msg, 100);

Использование std::string не повлияет на результаты, но мне было бы легче найти документацию. версия operator>> для строк также основана на словах. API получения строк для строк - это бесплатная функция, std::getline.


Предлагаемый ввод для одного из ваших тестов:

Done
DONE
donegal is in Ireland
done?
done!
done
...