Программа на C не входит в цикл «для»

#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]))