nullptr не прерывая цикл над строкой с нулем - PullRequest
0 голосов
/ 31 декабря 2018

Я попытался использовать следующий пример кода, приведенный в "Тур C ++", который использует nullptr для разрыва цикла над строкой с нулем в конце.Однако моя программа-пример, похоже, не останавливается в цикле.

Выдержка из книги:

первая версия кода из книги:

`` `

int count_x(char∗ p, char x)
// count the number of occurrences of x in p[]
// p is assumed to point to a zero-terminated array of char (or to nothing)
{
  if (p==nullptr) return 0;
  int count = 0;
  for (; p!=nullptr; ++p)
    if (∗p==x)
      ++count;
    return count;
}

`` `

вторая упрощенная версия

```int count_x(char* p, char x)
// count the number of occurrences of x in p[]
// p is assumed to point to a zero-terminated array of char (or to 
// nothing)
{
    int count = 0;
    while (p) {
      if (*p==x)
        ++count;
      ++p;
    }
  return count;
}```

оператор следующий код в книге: оператор while выполняется до тех пор, пока его условие не станет ложным.Проверка указателя (например, while (p)) эквивалентна сравнению указателя с нулевым указателем (например, while (p! = Nullptr)).

Моя программа использует ту же структуру:

char name[] = "ABCD";
char *p = name;
int count = 0;
int loopc = 0;
while (p)
{
    loopc++;
    if(*p == '\0')
        cout << "zero found\n";
    else 
        cout << *p << "\n";
    //emergency stop
    if (loopc == 12)
        break;
    p++;
}

ожидается: должен остановиться после печати имени.актуально: A B C D zero found zero found zero found zero found zero found zero found zero found zero found

Ответы [ 2 ]

0 голосов
/ 01 января 2019

первая версия должна вернуть 0, когда вы передадите ее nullptr.В цикле for вы проходите один раз.В любом случае есть только один char* (рассмотрите возможность использования std::string кстати) ... Вот мое быстрое решение, постарайтесь понять его:

int count_x(char* c_ptr, char c) { 
  if (c_ptr == nullptr) return 0; 
  int count = 0; 
  /* Note that I check if *c_ptr is '\0' that's the **value** 
   * pointed to by c_ptr 
   */
  for (; *c_ptr != '\0'; ++c_ptr) // '\0' is a nul character 
    if (*c_ptr == c) ++count; 
  return count; 
} 

int foo(const std::string& word, char letter) noexcept { 
  int count = 0; 
  for (const auto& c: word) { // for all const char ref in word 
    if (c == letter) ++count;
  }
  return count;
}

int main() {
  int a = count_x("acbccc", 'c');
  int b = foo("acbccc", 'c');
  std::cout << a << '\n' << b;
}

Не стесняйтесь спрашивать, если у вас есть какие-либо вопросы.Приветствия.

0 голосов
/ 01 января 2019

Спасибо за все полезные комментарии.

Похоже, что автор дал неправильный пример в более раннем издании (1-м), которое позже было исправлено во втором издании, выпущенном в 2018 году.

Исправленная версияиз новой редакции:

int count_x(char∗ p, char x)
// count the number of occurrences of x in p[]
// p is assumed to point to a zero-terminated array of char (or to nothing)
{
  if (p==nullptr) return 0;
  int count = 0;
  for (; *p!=0; ++p)
    if (∗p==x)
      ++count;
    return count;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...