2013-05-02 6 views
0

Я начал писать программу для подстрок выводов, но она не работает и всегда находила подстроку. Это было странное поведение, поэтому я написал простую программу:странное поведение стандартной библиотеки строк C++

#include <iostream> 
#include <string> 

using namespace std; 

int main(){ 
    string str; 
    str = "aaaa"; 
    unsigned found = str.find("bbbb"); 
    if(found!=std::string::npos){ 
     cout << "I FOUND IT!!!!\n"; 
    } 
    return 0; 
} 

и отображает текст «Я НАЙДЕЕСЬ !!!!» Я не понимаю, что происходит.

+1

кажется здесь не проблема: http://ideone.com/DfeGtM – taocp

+0

Какой у вас компилятор/stdlib? – oscode

+0

ideone 32bit, где 'sizeof (std :: string :: size_type) == sizeof (unsigned)'. В 64-битной архитектуре, подобной тому, что у этого человека есть, 'sizeof (size_type)', вероятно, 8 байтов, а нуль, расширяющий 'found' до 8 байтов, приведет к тому, что он будет отличаться от' size_type', который равен '-1'. – yiding

ответ

6

std::string::find возвращает size_t

std::string::npos определяется как максимальное значение, которое соответствует в size_t, вероятно 0xFFFFFFFFFFFFFFFF для программы 64-битную.

Когда вы приводите его в беззнаковое Int, это, вероятно, 32бит и так 0xFFFFFFFF

Как 0xFFFFFFFFFFFFFFFF != 0xFFFFFFFF вы получите результат, который вы видите.

1

Я скомпилировал ваш точный код и запустил его в VS2008, и он работал точно так, как ожидалось, поэтому я не думаю, что есть проблемы с кодом вообще.

EDIT: Хорошая точка от одного из комментаторов, которые были найдены без знака int! Сделайте его size_t, и я уверен, что он будет работать, независимо от архитектуры машины.

1

string :: npos имеет тип size_t, а не тип integer, поэтому на 64-битной машине «найденный» должен быть без знака long или just size_t.

0

Убедитесь, что вы используете тот же тип, что и std :: string :: npos. На моем ПК с Windows 7 он использует «unsigned int». Я проверил ваш код, и он работает для меня. Если вы работаете в Visual Studio 2012 (используя C++ 0x), вы можете использовать тип «auto».

auto found = str.find("bbbb"); 
+0

На моей абстрактной виртуальной машине C++ это «size_t», а не «unsigned int». Скорее убедитесь, что вы используете правильный тип для всех машин (это то, что делает авто, но вряд ли он будет использовать VS). –