2016-02-04 2 views
-1

В настоящее время я кодирую небольшую программу, которая будет использоваться для вычисления расстояния между двумя городами с учетом их географических координат (широты и долготы) (как, например, Google Maps) но только для ограниченного числа городов.Бесконечная петля с преобразованием строки в int

Моя программа получает название города, широту и долготу с помощью getline в текстовом файле. Например, Париж будет «paris 48.51.12 2.20.5».

Затем я разбираю строку, чтобы получить: a) имя, b) широту (которая вводится как angle.minutes.seconds), и c) долготу. Я разбираю широту и долготу, чтобы иметь вектор с 3 соответствующими номерами, но сохраняемый как строки.

Следующий шаг - преобразовать вектор строки в вектор int. Я нашел довольно аккуратный метод:

int strtoint(string str) 
{ 
    int i=0; 
    if(!(istringstream(str)>>i)) i=0; 
    return i; 
} 

А почему я не использую стои или atoi, я не могу получить мой компилятор (MinGW, в Code :: Blocks 13.12), чтобы понять их , поэтому, возможно, я пропустил шаг.

Однако, когда я пытаюсь использовать его с моим вектором, он переходит в бесконечный цикл, и я не понимаю, почему:

for(int unsigned i=0; i<latitude.size();i++) 
{ 
    cout<<latitude[i]<<endl; 
    i_latitude[i]=strtoint(latitude[i]); 
} 

С широтой быть вектор строк и i_latitude ИНТ вектор.

следующие работы для меня:

#include <iostream> 
#include <string> 
#include <sstream> 


using namespace std; 

int strtoint(string str) 
{ 
    int i=0; 
    if(!(istringstream(str)>>i)) i=0; 
    return i; 
} 

int main() 
{ 
    string str="45"; 
    int nbr=strtoint(str); 
    cout<<nbr<<endl<<endl; //shall return 45 as an integer 

    string foo [3]= {"45", "32", "15"}; 
    int ifoo [3]; 
    for(int i=0;i<3;i++) 
    { 
     ifoo[i]=strtoint(foo[i]); 
     cout<<ifoo[i]<<endl; //shall return 45 32 15 
    } 
    return 0; 
} 

[редактировать: добавлять примера]

+0

Пожалуйста, включите de [mcve]. Просто используя свой код и заполняя пробелы, как я считаю нужным, я не смог воспроизвести вашу проблему (https://ideone.com/bGqLbA). –

+0

@ AlgirdasPreidžius Я отредактировал вопрос, надеюсь, что это поможет. На самом деле тест, который я предоставляю, отлично подходит для меня, поэтому я действительно не понимаю, почему бесконечный цикл с вектором. Может быть, есть проблема с получением размера вектора? Но если да, то в чем смысл быть динамичным? – Tanos

+0

Это более полезно, если вы публикуете полный пример, который * не работает *. – molbdnilo

ответ

0

Поскольку вы используете C++ 11

for(auto& s : latitude) 
{ 
    cout<<s<<endl; 
    i_latitude.push_back(strtoint(s)); 
} 

Вы должны использовать ссылку, чтобы не делать строчная копия

int strtoint(const string & str) 
{ ... 
+0

Этот «ответ» касается только хороших методов кодирования, а не фактической проблемы, с которой сталкивается ОП. Любой «ответ» на этом этапе - это только спекуляция, поскольку описанная проблема ОП не воспроизводится с информацией, которую он нам дал. –

+0

Собственно, ваш ответ решает мою проблему, спасибо. Я до сих пор не понимаю, почему это произошло в первую очередь, поэтому, если у вас есть идея помочь мне понять это, я с радостью приму это! – Tanos

+0

Код, который вы опубликовали, будет работать. Очевидно, код, который вы опубликовали, не совпадает с кодом, который входит в бесконечный цикл. Возможно, вы забыли увеличить переменную цикла (i). Это самая распространенная ошибка кодирования в мире.Вот почему вы должны использовать цикл C++ for. – ravenspoint

Смежные вопросы