C++ 变量值的更新不可预测

C++ 变量值的更新不可预测,c++,character,codeblocks,dev-c++,C++,Character,Codeblocks,Dev C++,我已经尝试解决这个问题很长时间了。在给定的程序中,R被不可预测地更新,即使没有触摸它,这可以在第30行中看到,其中我打印的R是%d。同样在k循环的一些迭代之后,它显示出不可预测的行为。我不知道程序执行时出现了什么问题。请帮我做这个。提前谢谢 #include <stdio.h> #include <string> #include <iostream> using namespace std; int main() { int T; int R;

我已经尝试解决这个问题很长时间了。在给定的程序中,R被不可预测地更新,即使没有触摸它,这可以在第30行中看到,其中我打印的R是%d。同样在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;
}

您的数组帮助是94个字符,但是您的循环将在帮助[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
    }

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

请参见。您可以发布一些输入/输出示例吗?顺便说一句,您应该处理变量名…@NirMH我已经编辑并提供了一个输入/输出示例。@rightfold我将只进行编辑并使其最小化。很抱歉代码太大。我在VS2012 Win64位上执行了您的代码,没有任何问题。我没有观察到对R的任何更改。在第二次打印R时,它说R是3感谢有价值的输入,但我正在尝试将ascii值33到126之间的字符存储在帮助数组中。而b即空格的ascii值为33。因此,我只考虑阵列的94个字符。那么为什么它在这里是个问题。C++中的数组总是基于0的。因此,当您声明char help[94]时,您将得到一个0..93中的char数组。当您将某个内容分配给索引33+k时,当k>60时,您将得到一个高于93的地址;编辑:拼命想绕过编辑器所以,如果我想要一个以ascii值从33到126的字符作为索引的数组,而数组的大小是94,我应该怎么做?好吧,一般来说你不能这么做。c/c++中的数组总是基于0的。通常,您希望修改索引以反映这一点,即通过如上所述的偏移,使用标准库中的映射或字典,或者在特定情况下使帮助更大,即char help[33+k]——在这种情况下,您会白白浪费前33个字符,但这是可以忽略的。
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
    }