首页 > 解决方案 > 有没有办法打印通常分配给指针数组的整数?

问题描述

我正在创建一个涉及指针和数组的程序,但我偶然发现了一个问题。基本上,我创建了三个整数,它们将从用户的输入中获取其值,然后将它们全部声明在一个数组中,以便在一个循环中更改它们的所有值。

然后我声明了一个指针,它使用循环内的数组来做到这一点。

期望循环中的指针数组以正常顺序打印出数据,而是将其向后打印。

请注意,我是 C++ 编程的一个巨大的初学者,并且仍在学习指针。

我试过改变索引号

pntr = &salary[3];

但是 3 是唯一一个打印出循环中每个输入的。0 不起作用,同样适用于 1、2、4 等等。

我希望新输出具有相同的语法(salary1、salary2、salary3),而不是反转它(salary3、salary2、salary1)以打印出输入的值。

这是代码:

#include <iostream>
using namespace std;

int main() {
    int salary1, salary2, salary3;
    cout << "Enter salary for John: ";
    cin >> salary1;
    cout << "Enter salary for Mark: ";
    cin >> salary2;
    cout << "Enter salary for Nathan: ";
    cin >> salary3;
    cout << "Name \t Age \t Position \t Salary" << endl;
    cout << "John \t 16 \t Engineer \t " << salary1 << endl;
    cout << "Mark \t 16 \t Scouter \t " << salary2 << endl;
    cout << "Nathan \t 17 \t Manager \t " << salary3 << endl;
    int salary[3] = {salary1, salary2, salary3};
    int *pntr;
    pntr = &salary[3];
    for(int x = 0; x < 3; x++) {
        cout << "Enter new salary: " << endl;
        cin >> *(pntr + x);
        cout << "Salary 1:" << salary1 << endl;
        cout << "Salary 2:" << salary2 << endl;
        cout << "Salary 3:" << salary3 << endl;
    }
    cout << "Name \t Age \t Position \t Salary" << endl;
    cout << "John \t 16 \t Engineer \t " << salary1 << endl;
    cout << "Mark \t 16 \t Scouter \t " << salary2 << endl;
    cout << "Nathan \t 17 \t Manager \t " << salary3 << endl;
    return 0;
}

标签: c++arrayspointers

解决方案


您的直接问题是双重的。您初始化指针并立即将其指向数组之外。如果您有一个容量为 3 的数组,则您的索引如下:

 --- --- ---
| 0 | 1 | 2 |
 --- --- ---

索引 3 不在您的数组中,因此您的指针指向它之外。将您的初始化更改为:int* pntr = salary;.

然后,您的另一个问题是,当您将新工资放入数组时,您再也不会访问该数组。相反,您int再次查看您从未修改过的三个变量。这个练习也根本不需要变量。

这是修复当前问题的代码的精简版本。

#include <iostream>

int main() {
  int salary1, salary2, salary3;

  std::cout << "Enter salary for John: ";
  std::cin >> salary1;
  std::cout << "Enter salary for Mark: ";
  std::cin >> salary2;
  std::cout << "Enter salary for Nathan: ";
  std::cin >> salary3;
  std::cout << "Name \t Age \t Position \t Salary" << '\n';
  std::cout << "John \t 16 \t Engineer \t " << salary1 << '\n';
  std::cout << "Mark \t 16 \t Scouter \t " << salary2 << '\n';
  std::cout << "Nathan \t 17 \t Manager \t " << salary3 << '\n';

  int salary[3] = {salary1, salary2, salary3};
  int *pntr = salary;  // CHANGED

  // CHANGE: Print the array
  for (auto i : salary) {
    std::cout << i << '\n';
  }

  for (int x = 0; x < 3; x++) {
    std::cout << "Enter new salary: ";
    std::cin >> *(pntr + x);
    std::cout << "Salary " << x + 1 << ": " << salary[x]
              << '\n';  // CHANGED: Access the array
  }

  // CHANGE: Print the array
  for (auto i : salary) {
    std::cout << i << '\n';
  }

  return 0;
}

您将有一个仅用于薪水的数组似乎很奇怪。这是对您的程序的全新尝试,它利用了一些您可能还没有见过的 C++ 概念,但我希望您能够体会到它使您的代码变得多么简单。请注意,我不会长期将此代码称为最佳实践,但我认为它的目的是展示一些新原则。

最大的设计变化是,我们有一组人员,而不是仅仅一组薪水,如果需要,我们可以更改他们的薪水。

#include <iomanip>
#include <iostream>
#include <vector>

struct Person {
  std::string name;
  int age;
  std::string title;
  int salary;
};

void print_table(const std::vector<Person>& emp) {
  std::size_t maxNameLength = 0;
  std::size_t maxTitleLength = 0;
  for (auto i : emp) {
    if (i.name.length() > maxNameLength) maxNameLength = i.name.length();
    if (i.title.length() > maxTitleLength) maxTitleLength = i.title.length();
  }

  std::cout << std::setw(maxNameLength + 1) << "Name"
            << "|Age|" << std::setw(maxTitleLength + 1) << "Title"
            << "|Salary\n";
  for (auto i : emp) {
    std::cout << std::setw(maxNameLength + 1) << i.name << "|" << std::setw(3)
              << i.age << "|" << std::setw(maxTitleLength + 1) << i.title << "|"
              << std::setw(6) << i.salary << '\n';
  }
}

int main() {
  std::vector<Person> employees{{"John", 16, "Engineer", 0},
                                {"Mark", 16, "Scouter", 0},
                                {"Nathan", 17, "Manager", 0}};

  for (int x = 0; x < 3; x++) {
    std::cout << "Enter new salary for " << employees[x].name << ": ";
    std::cin >> employees[x].salary;
  }

  print_table(employees);

  return 0;
}

输出:

Enter new salary for John: 34
Enter new salary for Mark: 45
Enter new salary for Nathan: 56
   Name|Age|    Title|Salary
   John| 16| Engineer|    34
   Mark| 16|  Scouter|    45
 Nathan| 17|  Manager|    56

推荐阅读