#c #loops #for-loop #enter
Вопрос:
Я создаю программу, которая находит, сколько анаграмм содержит строка для домашнего задания, и у меня проблема. Моя программа не вводит простой цикл «для». Я читал весь вечер и не могу понять, в чем проблема. Я поставил 7 контрольных точек, чтобы увидеть, где именно они входят, а где нет. Результаты — 1, 2, 3 ,7 — даже не входят в цикл «для». В чем может быть проблема? Вот мой код:
#includelt;iostreamgt; #includelt;stringgt; #include lt;sstreamgt; #includelt;vectorgt; #include lt;algorithmgt; using namespace std; bool isAnagram(string x, string y) { vectorlt;chargt;v; int szX = x.size(), szY = y.size(); for (int i = 0; i lt; szX; i ) { if (!(find(v.begin(), v.end(), x[i]) != v.end())) { v.push_back(x[i]); } } for (int j = 0; j lt; szY; j ) { if (!(find(v.begin(), v.end(), y[j]) != v.end())) { return false; } } return true; } void breakStringToWords(string str, vectorlt;stringgt; w) { istringstream ss(str); string word; while (ss gt;gt; word) { w.push_back(word); } } int main() { string x; vectorlt;stringgt;v; int cnt=0,sz; while(getline(cin, x)) { if(x=="") { return 0; } coutlt;lt;1lt;lt;endl; breakStringToWords(x, v); coutlt;lt;2lt;lt;endl; sz=v.size(); coutlt;lt;3lt;lt;endl; for(int i=0; ilt;sz; i ) { coutlt;lt;4lt;lt;endl; if (isAnagram(v[i - 1], v[i])) { coutlt;lt;5lt;lt;endl; cnt ; } coutlt;lt;6lt;lt;endl; } coutlt;lt;7lt;lt;endl; coutlt;lt;cntlt;lt;endl; } return 0; }
Заранее благодарю вас!
Комментарии:
1. каково значение » sz «после» coutlt;lt;3lt;
2.
void breakStringToWords(string str, vectorlt;stringgt; w)
— Вы проходитеw
мимо значения, имея в виду, что оно временное. Вся та работа, которую вы проделалиw
, исчезнет в облаке дыма, когда эта функция вернется. C не является Java или каким-либо другим языком, использующим ссылочную семантику.3. Количество слов, введенных в текущей строке 🙂
4. Это
if
не может быть хорошо, так как i начинается с 0 ` если (изанаграмма(v[i — 1], v[i]))`, что приведетv[i - 1]
к выходу за рамки.
Ответ №1:
Вот одна ошибка:
void breakStringToWords(string str, vectorlt;stringgt; w)
Вы передаете w
значение по значению, что означает, что breakStringToWords
функция работает с временным вектором. Как только эта функция вернется, w
ее больше не будет.
Вы должны передавать по ссылке, а не по значению: void breakStringToWords(string str, vectorlt;stringgt;amp; w) // Note the amp;
Это ничем не отличается от того, чтобы делать что-то подобное:
#include lt;iostreamgt; void foo(int x) { x = 10; } int main() { int x = 0; foo(x); std::cout lt;lt; x; // x is still 0, not 10 }
Та же проблема, то же решение-передать по ссылке.
Комментарии:
1. Большое спасибо! Он вошел в цикл и выдал еще одно исключение 🙂 Продолжаем отладку!
Ответ №2:
Ре:
Он вошел в цикл и выдал еще одно исключение
когда i равно 0, вы получаете доступ v[-1]
:
for(int i=0; ilt;sz; i ) { coutlt;lt;4lt;lt;endl; if (isAnagram(v[i - 1], v[i]))