简体   繁体   中英

C++, If...Else with strings and special characters

I was trying to create a simple program to help my students to train German irregular verbs, but I have had problems with special characters and If statement. Basically it does not recognise the ä ö ü and ß, and output is therefore the Else statement (¨Nicht Gut"). How could I fix it?

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

using namespace std;


int main () {
   
   setlocale(LC_CTYPE, "German");
   string Antwort1;
   string Antwort2;
   string Antwort3;
   getline(cin, str);
   
   cout << str;

   cout << "Präsens von BEHALTEN (du)" << endl;
   cin >> Antwort1;
       
   if (Antwort1 == "behältst") {
       cout << "Gut!" << endl;
   }
   else {
       cout << "Nicht Gut" << endl;
   }
   
   cout << "Präsens von BEHALTEN (er/sie/es/man) " << endl;
   cin >> Antwort1;
       
   if (Antwort1 == "behält") {
       cout << "Gut!" << endl;
   }
   else {
       cout << "Nicht Gut" << endl;
   }

   return 0;   
}

I tried with


if (Antwort1 == (LC_CTYPE, "German"),"behält")


but then it causes the contrary effect. Then every single string I write is valid ("Gut").

My answer applies to the Windows 10 console using the classic default Command Prompt (I haven't tried it with other systems like PowerShell, nor I have tried these experiments on Linux yet).

It seems to me that, as of today (23 February 2022), Windows 10's Command Prompt and the Microsoft C/C++ Runtime of VS2019 don't support Unicode UTF-8 well : See, for example, this blog post showing a CRT crash you get when trying to call:

_setmode(_fileno(stdout), _O_U8TEXT);

and printing UTF-8 text using std::cout .

In my experience, you can make Unicode work in Windows Command Prompt using Unicode UTF-16 . You can still use UTF-8 in your C++ application, but you have to convert between UTF-8 and UTF-16 at the Windows boundaries.

I modified your code to use Unicode UTF-16, and the code seems to work correctly when compiled with Visual Studio 2019, and executed inside the Windows Command Prompt:

// Used for _setmode calls
#include <fcntl.h>
#include <io.h>
#include <stdio.h>

// Console I/O with Unicode UTF-16 wcin, wcout and wstring
#include <iostream>
#include <string>

using std::wcin;
using std::wcout;
using std::wstring;

int main() {
    // Enable Unicode UTF-16 console input/output
    _setmode(_fileno(stdout), _O_U16TEXT);
    _setmode(_fileno(stdin), _O_U16TEXT);

    wcout << L"Präsens von BEHALTEN (du) \n";
    wstring Antwort1;
    wcin >> Antwort1;

    if (Antwort1 == L"behältst") {
        wcout << L"Gut! \n";
    } else {
        wcout << L"Nicht Gut \n";
    }
}

Note the use of L"..." to represent UTF-16 string literals, and the use of wchar_t -based std::wcout , std::wcin , and std::wstring instead of the char -based std::cout , std::cin and std::string .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM