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)