2014-10-29 6 views
0

Я читаю книгу на C++ (тур по C++, Бьярне Страуструп, второе издание) и есть пример кода:Объяснение некоторого кода

int count_x(char* p,char x) 
{ 
    if (p==nullptr) return 0; 
    int count = 0; 
    for(;*p!=0;++p) 
     if (*p==x) 
      ++count; 
    return count; 
} 

В этой книге, это объясняется что указатель p функции должен указывать на массив char (т.е. на строку?).

Так что я попробовал этот код в основном:

string a = "Pouet"; 
string* p = &a; 
int count = count_x(p, a); 

Но count_x нужен обугленная не строка, так он не компилируется. Так что я пробовал:

char a[5] {'P','o','u','e','t'}; 
char* p = &a; 
int count = count_x(p, a); 

Но, конечно, это не будет работать, так как в одиночку указатель не может указывать на полный массив. Так, наконец, я попытался сделать массив указателя:

char a[5] {'P','o','u','e','t'}; 
char* p[5] {&a[0],&a[1],&a[2],&a[3],&a[4]}; 
int count = count_x(p, a); 

Но функция не будет принимать массивы, так как он был не только char.

Итак, я не имею ни малейшего представления о том, как использовать функцию count_x (который, как предполагается, подсчитывают количество x в p.

Не могли бы вы дать мне пример рабочего кода, который использует эту функцию?

.
+1

Нет, массив символов не совпадает с строковым объектом, и я хотел бы начать с некоторых основ C++ перед книгами Страустрапа. –

+0

«Определение count_x() предполагает, что char * является строкой в ​​стиле C» (из «Обзор C++», Stroustrup 2013). – molbdnilo

ответ

1

count_x функция подсчитывает количество вхождений данного символа во входном char массиве.

Для того, чтобы вызвать его правильно, вы должны предоставить ему указатель символ, указывающий на нуль-терминаторомchar массива и характер.

В первом примере вы пытаетесь передать объект string в качестве указателя char, это неправильно, поскольку они представляют собой два совершенно несвязанных типа, хотя в конце дня они могут содержать символы.

string a = "Pouet"; 
string* p = &a; 
int count = count_x(p, a); // Both arguments are wrong 

Ваша вторая попытка оказалась неудачной тоже:

char a[5] {'P', 'o', 'u', 'e', 't'}; // Lacks zero terminator 
char* p = &a; // Invalid, address of array assigned to char pointer 
int count = count_x(p, a); // Second argument is wrong, it wants a char 

и так же третий:

char a[5] {'P', 'o', 'u', 'e', 't'}; // Ditto as above 
char* p[5] {&a[0], &a[1], &a[2], &a[3], &a[4]}; // Array of char pointers 
int count = count_x(p, a); // Both totally wrong 

Правильный способ сделать это, чтобы помнить array decaying и передать нулевой завершающим char массив через указатель на первый элемент:

char a[6] = "Pouet"; // Notice the '6' that accounts for '\0' terminator 
char* p = a; // Array decays into a pointer 
int count = count_x(p, 'o'); 
+0

То, что мне не хватало, - это понятие разложения Array! Большое спасибо, это объясняет все мои проблемы :). –

1

функция выборки count_x подсчитывает, сколько раз символ «х» появляется в «а» массив полукокса Таким образом, вы должны перейти к count_x функции два параметра: массив и характер:

char a[5] {'P','o','u','e','t'}; 
char* p = &a; 
int count = count_x(p, a); //This does not work because 'a' is not a character, but an array of characters. 

//This is wrong because you are passing an array of pointers to chars, not an array of chars. 
char a[5] {'P','o','u','e','t'}; 
char* p[5] {&a[0],&a[1],&a[2],&a[3],&a[4]}; 
int count = count_x(p, a);` 

Правильный путь будет:

char a[5] {'P','o','u','e','t'}; 
char* p = a; //IT IS NOT &a, since 'a' can is already an array of chars. &a would be a pointer to array of chars 
int count = count_x(p, 'o'); //Passing p, an array of chars, and one character to search 

Или

char a[5] {'P','o','u','e','t'}; 
int count = count_x(a, 'o'); //Passing a, an array of chars, and one character to search 

Или

char a[5] {'P','o','u','e','t'}; 
char c='u'; 
int count = count_x(a, c); //Passing a, an array of chars, and one character to search 
+0

Я не понимаю, почему 'char a [5] {'P', 'o', 'u', 'e', ​​'t'}; int count = count_x (a, 'o'); // Передача a, массива символов и одного символа для поиска ' , работающего с функцией wan't указателя, и вы даете ему массив char EDIT: Я не понимаю, почему: char * p = «MySentence» работает! –

+0

Возможно, стоит упомянуть: кулачный случай можно использовать следующим образом: 'count_x (a.c_str(), 'o')', если функция 'count_x' изменена на' int count_x (const char * p, char x) ' – tgmath

+0

Хорошая идея! Благодарю. Для моих вопросов выше проблема заключалась в распаде массива! –

Смежные вопросы