Почему он имеет другое поведение в Интернете или нет

Предполагая этот код:

#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


К чему может быть это поведение? Извините за мой плохой английский. Надеюсь, вы понимаете, что я говорю?

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?"

Другие вопросы по тегам