#c #arrays #string #stdstring
Вопрос:
Я создал массив слов и создал функцию для возврата случайного слова из массива. Но это показывает эту ошибку —
hangman.cpp: In function 'std::__cxx11::string get_random_word(std::__cxx11::string*)':
hangman.cpp:17:33: warning: 'sizeof' on array function parameter 'words' will return size of 'std::__cxx11::string* {aka std::__cxx11::basic_string<char>*}' [-Wsizeof-array-argument]
size_t length = sizeof(words) / sizeof(words[0]);
^
hangman.cpp:15:47: note: declared here
std::string get_random_word(std::string words[])
^
Вот код —
#include <iostream>
#include <string>
#include <ctime>
std::string get_random_word(std::string words[]);
int main()
{
srand(time(0));
std::string words[] = {"cpp", "python", "java"};
std::cout << get_random_word(words);
return 0;
}
std::string get_random_word(std::string words[])
{
size_t length = sizeof(words) / sizeof(words[0]);
return words[rand() % length];
}
Комментарии:
1. Ошибка кажется довольно очевидной. Вы неправильно используете
sizeof
withsizeof(words)
, который возвращает размер указателя на массив, а это не то, что вы собираетесь делать.
Ответ №1:
sizeof
Оператор может делать не совсем то, что вы думаете. Согласно cppreference: ( sizeof
) Возвращает размер в байтах представления объекта типа. Это может включать любые внутренние члены, необходимые для класса, а не только количество символов, используемых, например, в строке. в std::string size()
length()
для этого есть функции и, которые одинаковы, и вместо использования массива вы можете использовать вектор, который также предоставляет size()
функцию.
#include <iostream>
#include <string>
#include <ctime>
#include <vector>
std::string get_random_word(std::vector<std::string>amp; words)
{
return words[rand() % words.size()];
}
int main()
{
srand(time(0));
std::vector<std::string> words = {"cpp", "python", "java"};
std::cout << get_random_word(words);
return 0;
}