【问题标题】:Unpredictable update in value of the variable变量值的不可预测的更新
【发布时间】:2014-07-29 02:23:37
【问题描述】:

我已经尝试解决这个问题很久了。在给定的程序中,即使没有触摸它,R 也会不可预测地更新,这可以在我打印 R is %d 的第 30 行中看到。同样在 k 循环的一些迭代之后,它显示出不可预测的行为。我不知道程序执行时会出现什么问题。请帮我解决这个问题。提前致谢。

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

using namespace std;

int main() {
  int T;
  int R;
  string test;
  scanf("%d", &T);
  int i = 0;
  for (; i < T; i++) {
    scanf("%d", &R);
    printf("Hi R is %d\n", R);
    int j = 1;
    char c, p;
    int k;
    char help[94];
    char b = 33;
    int lop;
    if (R != 0) {
      for (k = 0; k < 94; k++) {
        help[b + k] = 'f';
      }
      printf("R is %d\n", R);
      for (; j <= R; j++) {
        cin >> c >> p;
        printf("C is %c and P is %c\n", c, p);
        help[c] = p;
      }
    }
    cin >> test;
    int size = test.size();
    if (R != 0) {
      for (i = 0; i < size; i++) {
        if (help[test.at(i)] != 'f')
          test.replace(i, i, test.at(i), help[test.at(i)]);
      }
    }
    cout << "string till now is " << test;
  }
  return 0;
}

抱歉,代码太长了。 输入输出示例是

5
3
Hi R is 3
R is 1717986918

【问题讨论】:

  • 您能发布一些输入/输出示例吗?顺便说一句......你应该处理你的变量名......
  • @NirMH 我已经编辑并提供了一个输入/输出示例。
  • @rightfold 我只会编辑并使其最小化。抱歉,代码很大。
  • 我已经在 VS2012 Win64bit 上执行了您的代码,没有任何问题。我没有观察到R 的任何变化。在第二个R 打印它说R is 3

标签: c++ character codeblocks dev-c++


【解决方案1】:

您的数组帮助是 94 个字符,但是您的循环将在 help[b+k] = 'f' 中写入它的末尾,因为 b = 33。所以,您基本上是在覆盖内存;巧合的是,您注意到它是 K。

int main() {
int T;
int R;
string test;
scanf("%d", &T);
int i = 0;
for (; i < T; i++) {
  scanf("%d", &R);
  printf("Hi R is %d\n", R);
  int j = 1;
  char c, p;
  int k;
  char help[94];
  char b = 33;
  int lop;
  if (R != 0) {
    for (k = 0; k < 94; k++) {
      help[b + k] = 'f';  <----------- BOOM
    }

编辑:添加代码以突出问题

【讨论】:

  • 感谢您的宝贵意见,但我正在尝试将 ascii 值 33 到 126 的字符存储在帮助数组中。并且 b 即空间具有 ascii 值 33 。所以我只考虑数组的 94 个字符。那么为什么这里会出现问题。
  • c++ 中的数组总是从 0 开始的。所以当你声明 char help[94] 时,你会从 0..93 得到一个 char 数组。当您将某些内容分配给索引 33 + k 时,当 k > 60 时,您将获得高于 93 的地址。
  • 你要存储 help[k] = (char)(b + k); 编辑:拼命尝试解决编辑器
  • 那么,如果我想有一个ASCII值从33到126的字符作为索引的数组,并且数组的大小是94,我应该怎么做呢?
  • 好吧,一般来说你不能这样做。 c/c++ 中的数组总是从 0 开始的。一般来说,您想修改索引以反映这一点(即通过上面提示的偏移),使用标准库中的地图或字典,或者在您的特定情况下使帮助更大(即 char help[33 + k]) - 在这个如果您白白浪费了前 33 个字符,但这可以忽略不计。
猜你喜欢
  • 1970-01-01
  • 2016-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-09
  • 1970-01-01
相关资源
最近更新 更多