首页 > 解决方案 > 我正在尝试解决此问题,但由于分段错误而出现运行时错误

问题描述

我使用 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;
}

标签: c++arrays

解决方案


您一次读取 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是。

接下来,养成正确的代码风格和格式的习惯:这将节省您大量的调试时间(甚至是数年的浪费工作)。


推荐阅读