Предполагая этот код:
#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
Но в ideone
является:
Выход:
15
в cpp.sh
Выход: 15
К чему может быть это поведение? Извините за мой плохой английский. Надеюсь, вы понимаете, что я говорю?
Похоже, у вас есть проблема с кодировкой символов. В вашем исходном коде несколько используемых символов не являются членами 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?»
Других решений пока нет …