Невозможно понять вывод в указателях C ++.(Работа с петлями в указателях) - PullRequest
3 голосов
/ 15 мая 2019

Невозможно понять неожиданный вывод. Указатель не указывает на 0-й индекс нет. строки

Я пытался найти причину вывода следующей программы. цикл начинается с i = 0, но в 0-м индексе нет отображаемых символов. и цикл начинается с 1-го индекса №.

#include <conio.h>
#include <iostream.h>
#include <string.h>

int main() 
{
  clrscr();

  int i, n;
  char *x = "Alice";
  n = strlen(x);
  *x = x[n];

  for (i = 0; i <= n; i++) 
  {
    cout << x;
    x++;
  }

  cout << endl << x;
  getch();
}

Я получаю следующий вывод: liceicecee Но я ожидал, что вывод начнется с 'A'.

1 Ответ

5 голосов
/ 15 мая 2019

Вы должны действительно перейти на современный компилятор. Доступно много бесплатных.

#include <iostream.h> // non-standard header file
#include <string.h>   // not recommended - it brings its functions into the global namespace

void main() { // main must return "int"
    int i, n;
    char* x = "Alice"; // illegal, must be const char*
    n = strlen(x);
    *x = x[n]; // illegal copy of the terminating \0 to the first const char

    for(i = 0; i <= n; i++) { // <= includes the terminating \0
        cout << x; // will print: "", "lice", "ice", "ce", "e", ""
                   // since you move x forward below
        x++;
    }
    cout << endl << x; // x is now pointing after the \0, undefined behaviour
}

Если вы хотите печатать буквы по одной (используя вашу текущую программу в качестве основы), используя стандарт C ++:

#include <iostream>
#include <cstring>

int main() {
    const char* x = "Alice";
    size_t n = std::strlen(x);

    for(size_t i = 0; i < n; ++i, ++x) {
        std::cout << *x; // *x to dereferece x to get the char it's pointing at
    }
    std::cout << "\n"; // std::endl is overkill, no need to flush
}

Что strlen делает, это ищет первый \0 символ и подсчитывает, сколько времени ему пришлось искать. Вам действительно не нужно делать это здесь, так как вы проходите все символы (шагая x) самостоятельно. Иллюстрация:

#include <iostream>

int main() {
    const char* x = "Alice";
    size_t n = 0;

    while(*x != '\0') {
        std::cout << *x;
        ++x;
        ++n;
    }
    std::cout << "\nThe string was " << n << " characters long\n";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...