Как исправить ошибку strlen seg - PullRequest
0 голосов
/ 22 мая 2019

Я пытаюсь получить длину строки моего ключа для моей хэш-функции, и я продолжаю получать эту ошибку в GDB в том месте, где я пытаюсь использовать strlen:

"_strlen_sse2 () at ../sysdeps/x86_64/multiarch/../strlen.S:79
79  ../sysdeps/x86_64/multiarch/../strlen.S: No such file or directory."

Я пытался запустить gdb, мне не разрешено использовать строковый класс, я знаю, что моя программа не прошла эту строку кода.

int table::hashfunc(char key[])
{       
     int hash = 0;
      int k = 1;      
     int key_size = strlen(key); //PROGRAM DOESN'T RUN PAST HERE

      for(int i = 0; i < key_size; ++i)
      {       
              hash = hash + (int)key[i];
              hash = pow(hash, k);
      }
      int index = hash % SIZE;
      return index;


 }

 //This is where I call the hash function from.

int table::add_name(char character[], char movie[], char choice)
{ 
    int index = hashfunc(character);

Я ожидал, что key_size будет установлен на количество символов в ключе, но когда я проверяю strlen (ключ) в GDB, я получаю это:

 (gdb) print strlen(key)
 $1 = (size_t (*)(const char *)) 0x7ffff7156620 <__strlen_sse2>

вот где я читаю в клавише char:

do  
     {
    cout << "Please enter the name of the film you 
would like to add to: " <<endl;
                            cin.get(temp_movie, temp_size);
                            cin.ignore(100, '\n');

                            cout << "Enter 'C' to add a character, 
enter 'A' to add an actor: " <<endl;
                            cin >> choice;
                            cin.ignore(100, '\n');
                            choice = toupper(choice);

                            cout << "Enter the name of the character or 
 actor you would like to add: " <<endl;
                            cin.get(temp_name, temp_size);
                            cin.ignore(100, '\n');

                            if(choice == 'C')    
                                    character_table.add_name(temp_name, 
 temp_movie, choice);
                            else if(choice == 'A')
                                    actor_table.add_name(temp_name, 
  temp_movie, choice);
                            else
                                    cout << "That is an invalid choice. 
 please try again." <<endl;


                    }while(choice != 'A' && choice != 'C');

1 Ответ

2 голосов
/ 22 мая 2019

Документация strlen гласит:

Возвращает длину данной строки байтов, то есть количество символов в массиве символов, первый элемент которого равенуказывает на стр. до и не включая первый нулевой символ.Поведение не определено, если в массиве символов нет нулевого символа, на который указывает строка.

Возможно, в вашем char key[] отсутствует конечный нулевой символ \0.

...