c++ - 我正在尝试解决此问题,但由于分段错误而出现运行时错误
问题描述
我使用 scanf 获取 3 个变量的输入,但我相信当它仅获得 2 个整数作为输入时它会崩溃,有人可以建议一种更好的方法来扫描所有 3 个变量
问题:
您受雇为公司的内部网络提供电话号码查询服务。该公司有 N 名员工,员工 ID 为 0 到 N-1。你的工作是当询问员工 i 的电话号码时,在屏幕上输出那个人的电话号码。
此外,还会要求您更新目录。除了查询之外,您的老板可能会不时要求您更新员工的编号,您应该这样做。
输入规范 第一行将包含两个整数 N 和 M (1
以下 N 行每行包含一个整数 P (1
然后,接下来的 M 行将首先包含一个整数 t (t∈0,1),指示请求类型。
如果 t 为 0,则后面将通过一个整数查询电话号码,该整数是员工的 ID。
如果 t 为 1,则后面是整数 i 中的员工 ID,然后是带有新电话号码的整数 k。
输出规范 在您的输出中应该有 M 行,每行一个整数表示所询问的电话号码。
如果查询询问不在目录中的员工(P>N-1),则输出 No entry。
如果查询要求您更新电话号码,则输出 i 的新号码是 k,其中 i 是员工 ID,k 是新号码。
样本输入 1
5 5
1024
2048
7789
4321
42
0 2
0 7
0 3
1 2 1111
0 2
样本输出 1
7789
No entry
3
New number for 2 is 1111
1111
#include <cstdio>
int main() {
int n, m, t, i, k;
scanf("%d %d \n", & n, & m);
int a[n];
for (int j = 0; j < n; j++) {
scanf("%d\n", & a[j]);
}
for (int j = 0; j < m; j++) {
scanf("%d %d %d\n", & t, & i, & k);
if (t == 1) {
if (i > n - 1) printf("No entry\n");
else {
a[i] = k;
printf("New number for %d is %d\n", i, k);
}
} else if (t == 0 && i > n - 1) printf("No entry\n");
else printf("%d\n", a[i]);
}
return 0;
}
解决方案
您一次读取 3 个值:
scanf("%d %d %d\n", & t, & i, & k);
但整数的实际数量取决于 的值t
。这意味着,对于第一次读取这些数据时的样本输入,(t, i, k) 的值将是 (0, 2, 0)。下一次读取出乎意料的是 (7, 0, 3),而且程序还没有准备好t = 7
. k
当 for 的值被读入时,您可能会遇到一种情况i
,其值t
既不是 0 也不是 1。在这种情况下,您的程序将执行最后一个else
分支:
printf("%d\n", a[i]);
的值k
可能超出范围,这将导致分段错误。
如何解决问题?首先,您需要拆分读取t
和其余值:
for (int j = 0; j < m; j++) {
scanf("%d", &t);
if (t == 1) {
// Read 2 values and implement the logic for t == 1
}
else if (t == 0) {
// Read just 1 value and implement the logic for t == 0
}
else {
printf("Input error! Wrong value of t. t == &d\n", t);
}
}
接下来,阅读scanf
家庭文档(https://en.cppreference.com/w/c/io/fscanf)并研究函数如何使用格式字符串。提示:它忽略空格。
更好的选择:研究 C++ 惯用的输入/输出流系统。提示:printf
/scanf
不是要走的路,但std::cin
/std::cout
是。
接下来,养成正确的代码风格和格式的习惯:这将节省您大量的调试时间(甚至是数年的浪费工作)。
推荐阅读
- c++ - 为什么可以使用指针创建新结构,但不能以相同的方式创建双精度结构?
- java - 导入 Maven 项目后出现 TestNG 错误
- java - Tomcat 不提供简单的 HTML 页面 (HTTP 404)
- spring-boot - 使用 Spring-Config Cloud Server 在自定义文件夹中加载多个基于 Profile 的属性
- r - 在 .rmd 文件中编译 TeX 的错误以创建 .html
- xamarin - Xmrain 表单应用程序部署失败
- java - 如何修复 ORA-01008:并非所有变量都绑定
- android - 'ng2-pdf-viewer' 不适用于带有 Ionic 3 的 iOS 中的本地 pdf
- bash - M4:如何从脚本中删除前导空格,然后是文件?
- javascript - 如何从我作为道具提供的反应组件的属性中评估图像的来源?