0

假设这段代码:

#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;
}

为什么它在以下方面具有不同的行为codechef

输出:

13

https://www.codechef.com/ide

但在ideone是:

输出:

15

https://ideone.com/jzbxA1

输入cpp.sh 输出:为 15


这种行为会是什么?我很抱歉我的英语不好我希望你能明白我说的话吗?

4

1 回答 1

1

看起来你有一个字符编码问题。在您的源代码中使用的几个字符不是 ASCII 的成员。这使您对扩展 ASCII 的不同编码和不同解释持开放态度。

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

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

string test = "Hola, cómo estás";

这也放入了 15 个字符,test因为abc其中一些字符占用了超过一个字节。使用std::wstring而不是std::string应该对此有所帮助,但您还需要使用 Widechar 字符串文字

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

wstring test = L"Hola, cómo estás";

而且当然

int letters_counted_in_text(std::wstring const&text)

因为我们需要传入wstring函数。

这是在ideone上:http: //ideone.com/fAVPKt

现在我们留下了一个问题,“为什么这对 CodeChef 有效?”

于 2017-03-18T04:14:48.677 回答