C — Ошибка при использовании массивов usign в качестве параметра

#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 with sizeof(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;
}