c++ - 有没有办法打印通常分配给指针数组的整数?
问题描述
我正在创建一个涉及指针和数组的程序,但我偶然发现了一个问题。基本上,我创建了三个整数,它们将从用户的输入中获取其值,然后将它们全部声明在一个数组中,以便在一个循环中更改它们的所有值。
然后我声明了一个指针,它使用循环内的数组来做到这一点。
期望循环中的指针数组以正常顺序打印出数据,而是将其向后打印。
请注意,我是 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;
}
解决方案
您的直接问题是双重的。您初始化指针并立即将其指向数组之外。如果您有一个容量为 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
推荐阅读
- python - python中函数的动态输入数
- python - 运行文件夹中的所有 Python 脚本 - 从 Python
- angular - 带有 Material Snackbar 的 Angular StaticInjectorError
- react-native - textAlign justify 属性在本机反应中不起作用
- python - 使用 for 循环查找索引
- json - 有没有办法在 Java 中区分两个 Avro GenericRecords 以仅获取更改的字段和值?
- python - 两部分发布请求以获取 CSRF 令牌,然后发出另一个请求
- openshift - 使用 Openshift s2i 二进制构建向图像添加标签
- r - 合并不同维度 r 的列表元素
- kubernetes - 我可以在同一个集群的两个不同命名空间中使用两个 Haproxy 入口控制器吗?