Krithikzz2002 Ответов: 2

Как мне исправить эту логическую ошибку


char carname[][10]={"Toyota","Mazda","Acura","Audi","Nissan"};
void CAR::car_enter(int &size, int no_each_car[])
{     char nametemp[10];
      int z=0;
 cout<<"Enter car name: ";
 gets(nametemp) ;
 for(int i=0; i<size; i++)
 {
   if(strcmpi(nametemp,carname[i])==0)
   {
    no_each_car[i]++;
    z=1;
   }
 }
 if(z==0)
 {

  strcpy(carname[size],nametemp);
  no_each_car[size]=10;
  ++size;

 }
}

когда я добавляю нового участника в carname, все, что я добавляю, добавляется перед всеми участниками

Что я уже пробовал:

like if i input asd, when i call the display function the output is
asdToyota
asdMazda
asdAcura
asdAudi
asdNissan
asdasd

2 Ответов

Рейтинг:
2

CPallini

Эй, парень, это так C++, отличающ мощной стандартной библиотекой, с строкой и контейнерами. Используя set контейнер вам не нужно эксплицитно писать "проверьте наличие дубликатов" код.

#include <iostream>
#include <set>
using namespace std;

void car_enter(set < string > & cnset)
{
  string brand;
  cout << "please enter the car brand" << endl;
  cin >> brand;
  cnset.insert( brand);
}

int main()
{
  set < string > carnameset {"Toyota","Mazda","Acura","Audi","Nissan"};
  car_enter( carnameset );
  for ( const auto & carname : carnameset)
    cout << carname << endl;
}


jeron1

:большой палец вверх:

CPallini

Спасибо. :-)

Рейтинг:
2

OriginalGriff

В принципе, Ваш массив недостаточно велик.

char carname[][10]={"Toyota","Mazda","Acura","Audi","Nissan"};

Выделяет 5 элементов, поэтому при попытке добавить шестой ему некуда деваться, и все это начинает заваливаться.
Чтобы добавить к этому, размер начинается с нуля, z начинается с нуля, поэтому он всегда не найдет имя и попытается добавить его.

Ну же - вы работаете над этим кодом уже несколько дней, и вы еще не показали никаких признаков использования отладчика. Разбейте отладчик, поставьте точку останова в начале метода и начните смотреть на то, что именно делает ваш код! Это будет намного быстрее в долгосрочной перспективе, и он начнет учить вас, как использовать отладчик на тривиальном коде, как это, а не ждать, пока у вас есть 20 000 строк кода и ошибка, которую вы не можете найти...
Поверь мне, это совсем не сложно!


Krithikzz2002

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

OriginalGriff

Нет, вы объявляете размер массива, когда предоставляете инициализатор. Вы задаете пять имен, поэтому система выделяет пять ячеек памяти. Массивы не "растягиваются" автоматически, чтобы соответствовать тому, что вы добавляете!
Кажется, это работает - немного - потому что он еще не "пробегает" ничего важного. В конце концов, так и будет ... и они ваше приложение рухнет вместо того, чтобы просто показывать глупые результаты.

Серьезно, начните работать с отладчиком - это намного быстрее, чем просить других исправить каждую обнаруженную проблему...

Krithikzz2002

Ок понял.
спасибо
Ах, на самом деле я не знаю, как использовать отладчик. я попробовал посмотреть несколько видео, но не совсем понял.

OriginalGriff

Я не могу вам помочь - они все разные, и я понятия не имею, какую систему вы используете, - поэтому google для названия вашей IDE и "отладчика", и вы должны найти много информации.
Лично я считаю, что большинство "видеоуроков" хуже, чем бесполезны: сделаны людьми, у которых нет видео-талантов, и если Вам повезет, немного больше информации, чем у вас ... Я бы поискал текстовое описание.
Точка останова - это место, где вы хотите, чтобы отладчик остановился и предоставил вам контроль.
Step / Single Step / Step into / Step over - выполнение кода по одной строке за раз, чтобы точно узнать, куда он идет.
Все они позволяют вам также смотреть на содержимое переменной / памяти, так что вы можете сказать, что он будет делать, когда вы выполните следующую инструкцию.

Попробуйте - это действительно удобно!

Krithikzz2002

хорошо большое вам спасибо

OriginalGriff

Всегда пожалуйста!