2017-04-13 1 views
-2

이 프로그램 정렬 후에 이진 검색을 사용하고 있으며 알파벳 순으로 정렬 한 후 충돌을 멈추는 방법을 알지 못합니다.다른 기능을 계속 사용하기 전에 프로그램이 멈추는 원인은 무엇입니까?

하여 Main.cpp

#include <iostream> 

#include "ReadString.h" 
#include "SortString.h" 
#include "SearchString.h" 

using namespace std; 

int main() 
{ 
    int i; 
    int column = 500; 
    int row = 20; 
    char *inputsearch; 

    cout << "How many names will you enter? "; 
    cin >> row; 

    while (row > 20 || row < 0) 
    { 
     cout << "Error: Please do not enter more than 20 or less than 0: "; 
     cin >> row; 
    } 

    char **p = ReadString(row, column); 

    cout << "Printed: " << endl; 

    for (i = 0; i < row; i++) 
    { 
     cout << *(p + i) << endl; 
    } 

    StringSort(p, row); 
    cin >> inputsearch; 
    cout << inputsearch; 
    SearchString(p, inputsearch); 




    for (i = 0; i < row; i++) 
     delete[] p[i]; 

    delete[] p; 

    return 0; 
} 

Readstring.cpp

#include <iostream> 
#include <cstring> 

#include "ReadString.h" 

using namespace std; 

char **ReadString(int row, int column) 
{ 
    char **String = 0; 
    int i; 
    String = new char *[row]; 
    int NumChars; 

    for (i = 0; i < row; i++) 
     String[i] = new char[column]; 

    for (i = 0; i < row; i++) 
    { 
     cout << "Enter name " << i + 1 << ": "; 
     cin >> String[i]; 

     NumChars = strlen(String[i]); 
    } 

    return String; 
} 

Readstring.h

#ifndef READ_STRING_H 
#define READ_STRING_H 

char **ReadString(int, int); 


#endif 

SortString.cpp

#include<iostream> 
#include<conio.h> 
#include<stdio.h> 

#include "SortString.h" 

using namespace std; 

void StringSort(char **str, int row) 
{ 
    char t[20]; 
    int i, j, k; 

    for (i = 1; i < row; i++) 
    { 
     for (j = 1; j < row; j++) 
     { 
      //compare each 
      if (strcmp(str[j - 1], str[j])>0) 

      { 
       strcpy(t, str[j - 1]); 
       strcpy(str[j - 1], str[j]); 
       strcpy(str[j], t); 
      } 
     } 
    } 
    cout << "Strings (Names) in alphabetical order : \n"; 
    for (i = 0; i < 5; i++) 
    { 
     cout << str[i] << "\n"; 
    } 
    getch(); 
} 

SortString.h

#ifndef SORT_STRING_H 
#define SORT_STRING_H 

void StringSort(char **, int); 

#endif 

SearchString.cpp

#include <string.h> 

#include "SearchString.h" 

int SearchString(char **p, char *inputsearch) 
{ 
    int  First; 
    int  Middle; 
    int  Last; 

    First = 0; 
    Last = strlen(*p) - 1; 
    do { 
     Middle = (First + Last)/2; 
     if (inputsearch == p[Middle]) 
      return Middle; 
     else 
      if (inputsearch > p[Middle]) 
       First = Middle + 1; 
      else 
       Last = Middle - 1; 
    } while (First <= Last); 
    return -1; 
} 

SearchString.h

#ifndef Search_String_H 
#define Search_String_H 

int SearchString(char **, char *); 

#endif 
+2

디버거를 사용하여 코드를 단계별로 실행할 때 한 번에 한 줄씩 디버거가 충돌을 감지 한 지점까지 모든 변수의 값을 검사 할 때 어떤 관측을 했습니까? –

+1

버퍼 크기가 일치하지 않습니다. 때로는 500입니다. 때로는 20입니다. 버퍼 오버플로가 의심됩니다. 하지만 C++을 사용하고 있으므로'std :: string'과'std :: vector'를 사용해야합니다. –

답변

0

당신은 >> CIN을 수행 할 때 문자열 [I] ReadString.cpp에서 입력 길이와 널 종결자를 더한 값이 'column'크기의 배열 크기보다 작은 지 확인하지 않습니다. 열 너비보다 많은 문자를 입력하면 freestore 힙이 손상됩니다.

관련 문제