Я пытаюсь выполнить следующее упражнение по программированию из моей книги по C ++: «Напишите функцию, которая принимает строку в качестве аргумента и возвращает простой хеш-код, который вычисляется путем сложения значений всех символов в строке.«
Мое решение это:
#include <iostream>
#include <string>
#define clrscr() system("cls")
#define pause() system("pause")
using namespace std;
int hashc(char string[]);
int main()
{
char phrase[256];
cout << "This program converts any string into primitve hash-code." << "\n";
cout << "Input phrase: "; cin.getline(phrase, sizeof(phrase));
cout << "\n";
cout << "Hash-code for your phrase is: " << hashc(phrase) << "\n\n";
pause();
return(0);
}
int hashc(char string[])
{
int index;
int length;
int hash_value = 0;
length = strlen(string);
for(index = 0; index >= length; ++index)
{
hash_value = hash_value + string[index];
}return(hash_value);
}
Проблема в том, что функция всегда возвращает hash_value = 0
так как кажется, что он пропускает цикл for. Когда я вернусь length
в функции он возвращает правильную длину заданной строки (которая index >= length
за index = 0
). Поэтому он должен нормально запускать цикл for, не так ли? Небольшая подсказка здесь очень ценится!
Ура!
Идиоматический цикл for должен выглядеть так:
for(index = 0; index < length; ++index)
{
hash_value += string[index];
}
Ключевые особенности в том, что индекс начинается с 0 (index = 0
), индекс сравнивается с длиной «меньше» (index < length
) и, как у вас есть, индекс увеличивается с помощью предварительного увеличения (++index
).
for(index = 0; index < length; ++index)
В данный момент вы никогда не входите в цикл, и никакие символы не вызвали ошибку сегментации в моей системе. Он входит в цикл в единственной ситуации, когда он проходит условие (length >= index
, т. е. 0> = 0), а затем зацикливается, пока не попытается получить доступ к недопустимому местоположению, и в этот момент возникает ошибка сегмента.