C++ 为什么它在不同的ide中有不同的行为

C++ 为什么它在不同的ide中有不同的行为,c++,ide,online-compilation,C++,Ide,Online Compilation,假设此代码: #include <iostream> using namespace std; int letters_counted_in_text( std::string const&text ) { int count = 0; string abc = "abcdefghijklmnñopqrstuvwxyzáéíóúABCDEFGHIJKLMNÑOPQRSTUVWXYZÁÉÍÓÚ"; for( unsigned i=0; i<text.len

假设此代码:

#include <iostream>
using namespace std;

int letters_counted_in_text( std::string const&text ) {
  int count = 0;
  string abc = "abcdefghijklmnñopqrstuvwxyzáéíóúABCDEFGHIJKLMNÑOPQRSTUVWXYZÁÉÍÓÚ";

  for( unsigned i=0; i<text.length(); ++i )
    for( unsigned j=0; j<abc.length(); ++j )
      if( text.at( i )==abc.at( j ) )
      {
        count++;
        j=abc.length();
      }
  return count;
}

int main() {
    // your code goes here
    string test = "Hola, cómo estás";
    cout << letters_counted_in_text(test);

    return 0;
}

但是在ideone中,ideone是:

输出:

13
15

cpp.sh
输出中:为15



这种行为会是什么?很抱歉我的英语不好,我希望你能理解我说的话。

看起来你的字符编码有问题。在源代码中,使用的几个字符不是ASCII的成员。这使您可以使用不同的编码和对扩展ASCII的不同解释

例如,将源代码保存为UTF-8,然后使用只读取原始ASCII的编辑器打开,字符串就会显示出来

string abc = "abcdefghijklmnñopqrstuvwxyzáéíóúABCDEFGHIJKLMNÑOPQRSTUVWXYZÃÉÃÓÚ";

这将在
test
中放入15个字符,这些字符也在
abc
中,因为其中一些字符占用了一个以上的字节。使用
std::wstring
而不是
std::string
应该有帮助,但是您还需要使用widechar字符串文本

wstring abc = L"abcdefghijklmnñopqrstuvwxyzáéíóúABCDEFGHIJKLMNÑOPQRSTUVWXYZÁÉÍÓÚ";

当然

int letters_counted_in_text(std::wstring const&text)
因为我们需要将
wstring
传入函数

这是关于ideone的:


现在,我们剩下的问题是,“为什么CodeChef上会出现这种情况?”

您使用的一些字符没有用ASCII表示,因此ASCII(或其他编码)的不同扩展可能会产生不同的结果。在count++上放置一个断点,看看是什么触发了它。想一想,如果我将字符串转储到UTF-8,然后将其读回ASCII:“Hola,cómo estÃs”15个字符,会发生什么情况。@user4581301这很有意义。但是因为codechef不一样,它可以通过一些编译器配置来实现吗?感谢您的时间,我想您需要
string test=u8“你好,cómo estás”,但不幸的是,我不知道如何将UTF-8字符串文字转换为
wstring
来进行比较,而不转换为流并返回。我错了。更简单的方法。感谢您的时间,我将投票并标记为已接受,如果有另一个解决了CodeChef之谜,我将删除它。我在CodeChef中测试您的代码,我得到以下->
错误:转换为执行字符集:无效或不完整的多字节或宽字符
,了解原因可能会有所帮助。“但在ideone中没有错误。”安吉尔自己得到的。他们正在用UTF-8做一些奇怪的事情。我不知道是什么,但我不认为这是犹太教。
wstring test = L"Hola, cómo estás";
int letters_counted_in_text(std::wstring const&text)