0

I'm trying to learn coding, and am creating a binary search program. When trying to run my code, I get a debug assertion failure (see debug output below) when I try to call upon the search function. What have I screwed up?

#include<iostream>
#include<string>

using namespace std;

const int N = 100;

string names[N];
string query;

//function to search for names in the list

string search(int largestNum, int smallestNum, string names, string query);


int main(){

    cout << "Please enter the names, pressing enter after each entry." << endl 
        << "Type done when you are finished the list" << endl
        << "1.";
    cin >> names[0];

    int ticker1 = 1;

    /*this loop outputs a number 1 greater then the last and allows the 
    user to enter a new name until they type "done" which will exit the loop*/
    do {
        cout << endl << ticker1 + 1 << ".";
        cin >> names[ticker1];
        ticker1++;
    } while ((names[ticker1 - 1] != "done") && (names[ticker1 - 1] != "Done"));

    cout << endl;

    int ticker2 = 0;

    while (ticker2 < (ticker1 - 1)){
        cout << ticker2 + 1 << "." << names[ticker2] << endl;
        ticker2++;
    }

    int largestNum = ticker1;
    int smallestNum = 0;

    cout << "Please Enter the name that you would like to search for:";
    cin >> query;

    cout << search(largestNum, smallestNum, names[N], query);
    return 0;
}
//function to search for names in the list

string search(int largestNum, int smallestNum, string names, string query){
    string middleName;

    int middle = ((largestNum - smallestNum) / 2);

    middleName = names[middle];
    cout << middleName;

    if (query == middleName) return { "Present", "Location:" + middle };
    else return { "Not around" };
}

DEBUG OUTPUT

'Learning C++.exe' (Win32): Loaded 'C:\Users\Gareth\Programming\Projects\Learning C++\Debug\Learning C++.exe'. Symbols loaded.
'Learning C++.exe' (Win32): Loaded 'C:\Windows\SysWOW64\ntdll.dll'. Cannot find or open the PDB file.
'Learning C++.exe' (Win32): Loaded 'C:\Windows\SysWOW64\kernel32.dll'. Cannot find or open the PDB file.
'Learning C++.exe' (Win32): Loaded 'C:\Windows\SysWOW64\KernelBase.dll'. Cannot find or open the PDB file.
'Learning C++.exe' (Win32): Loaded 'C:\Windows\SysWOW64\msvcp120d.dll'. Cannot find or open the PDB file.
'Learning C++.exe' (Win32): Loaded 'C:\Windows\SysWOW64\msvcr120d.dll'. Cannot find or open the PDB file.
'Learning C++.exe' (Win32): Loaded 'C:\Windows\SysWOW64\user32.dll'. Cannot find or open the PDB file.
'Learning C++.exe' (Win32): Loaded 'C:\Windows\SysWOW64\gdi32.dll'. Cannot find or open the PDB file.
'Learning C++.exe' (Win32): Loaded 'C:\Windows\SysWOW64\imm32.dll'. Cannot find or open the PDB file.
'Learning C++.exe' (Win32): Loaded 'C:\Windows\SysWOW64\msctf.dll'. Cannot find or open the PDB file.
'Learning C++.exe' (Win32): Loaded 'C:\Windows\SysWOW64\msvcrt.dll'. Cannot find or open the PDB file.
Debug Assertion Failed!

Program: C:\Windows\SYSTEM32\MSVCP120D.dll
File: c:\program files (x86)\microsoft visual studio 12.0\vc\include\xstring
Line: 1685

Expression: string subscript out of range

For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.

(Press Retry to debug the application)
'Learning C++.exe' (Win32): Loaded 'C:\Windows\SysWOW64\uxtheme.dll'. Cannot find or open the PDB file.
'Learning C++.exe' (Win32): Loaded 'C:\Windows\SysWOW64\HsSrv.dll'. Cannot find or open the PDB file.
'Learning C++.exe' (Win32): Loaded 'C:\Windows\SysWOW64\winmm.dll'. Cannot find or open the PDB file.
'Learning C++.exe' (Win32): Loaded 'C:\Windows\SysWOW64\dsound.dll'. Cannot find or open the PDB file.
'Learning C++.exe' (Win32): Loaded 'C:\Windows\SysWOW64\version.dll'. Cannot find or open the PDB file.
'Learning C++.exe' (Win32): Loaded 'C:\Windows\SysWOW64\advapi32.dll'. Cannot find or open the PDB file.
'Learning C++.exe' (Win32): Loaded 'C:\Windows\SysWOW64\ole32.dll'. Cannot find or open the PDB file.
'Learning C++.exe' (Win32): Loaded 'C:\Windows\SysWOW64\winmmbase.dll'. Cannot find or open the PDB file.
'Learning C++.exe' (Win32): Loaded 'C:\Windows\SysWOW64\powrprof.dll'. Cannot find or open the PDB file.
'Learning C++.exe' (Win32): Loaded 'C:\Windows\SysWOW64\sechost.dll'. Cannot find or open the PDB file.
'Learning C++.exe' (Win32): Loaded 'C:\Windows\SysWOW64\rpcrt4.dll'. Cannot find or open the PDB file.
'Learning C++.exe' (Win32): Loaded 'C:\Windows\SysWOW64\combase.dll'. Cannot find or open the PDB file.
'Learning C++.exe' (Win32): Loaded 'C:\Windows\SysWOW64\cfgmgr32.dll'. Cannot find or open the PDB file.
'Learning C++.exe' (Win32): Loaded 'C:\Windows\SysWOW64\devobj.dll'. Cannot find or open the PDB file.
'Learning C++.exe' (Win32): Loaded 'C:\Windows\SysWOW64\sspicli.dll'. Cannot find or open the PDB file.
'Learning C++.exe' (Win32): Loaded 'C:\Windows\SysWOW64\cryptbase.dll'. Cannot find or open the PDB file.
'Learning C++.exe' (Win32): Loaded 'C:\Windows\SysWOW64\bcryptprimitives.dll'. Cannot find or open the PDB file.
'Learning C++.exe' (Win32): Loaded 'C:\Windows\SysWOW64\dwmapi.dll'. Cannot find or open the PDB file.
'Learning C++.exe' (Win32): Loaded 'C:\Windows\SysWOW64\clbcatq.dll'. Cannot find or open the PDB file.
'Learning C++.exe' (Win32): Loaded 'C:\Windows\SysWOW64\oleaut32.dll'. Cannot find or open the PDB file.
'Learning C++.exe' (Win32): Loaded 'C:\Program Files (x86)\DisplayFusion\Hooks\AppHookx86_45641EBC-D115-4D9A-BB79-9CB07566629C.dll'. Module was built without symbols.
'Learning C++.exe' (Win32): Loaded 'C:\Windows\SysWOW64\shell32.dll'. Cannot find or open the PDB file.
'Learning C++.exe' (Win32): Loaded 'C:\Windows\WinSxS\x86_microsoft.windows.common-controls_6595b64144ccf1df_5.82.9200.16658_none_bf1359a245f1cd12\comctl32.dll'. Cannot find or open the PDB file.
'Learning C++.exe' (Win32): Loaded 'C:\Windows\SysWOW64\shlwapi.dll'. Cannot find or open the PDB file.
The program '[9200] Learning C++.exe' has exited with code 3 (0x3).
Angew is no longer proud of SO
  • 167,307
  • 17
  • 350
  • 455
sparky2012
  • 55
  • 1
  • 8

2 Answers2

3

It seems you want your function to find a particular name (query) in your array of names (names). But the function's interface is incorrect for that.

Its parameter names is currently of type string, which means it's a single string. If you want to pass the global variable names in, change the function to accept a pointer to string, and make it so that it points to the first element of the array:

string search(int largestNum, int smallestNum, const string *names, string query)
{
  // as before..., except:

  if (query == middleName) return "Present\nLocation:" + std::to_string(middle);
  else return "Not around";
}

At the call site, just pass names instead of names[N] (which was accessing an out-of-bounds index anyway):

cout << search(largestNum, smallestNum, names, query);

The source of the original assertion was that initialising a std::string with { "Present", "Location: " + middle } does not do even remotely what you probably thought it does. It invokes the std::string constructor which takes two iterators, expected to delimit a range of characters to copy into the string.

So what you were effectively telling the program: "Start from the address of the first character in the literal "Present" and go on until you reach the address of the middle-th character of the literal "Location: ", copying everything in between into the string. This is of course an absolute mess.

If you want some learning resources, we keep a list of good C++ books here on Stack Overflow.

Community
  • 1
  • 1
Angew is no longer proud of SO
  • 167,307
  • 17
  • 350
  • 455
-1

You are passing names[N] to search(..), but most likely position 100 does not exist. N is set to 100. Just pass a valid array location or pass the entire array and the length of names to iterate over names. Also you are using this line middleName = names[middle]; but names is not a string array, just a string.

Engineer2021
  • 3,288
  • 6
  • 29
  • 51