C++ 变量值的更新不可预测
我已经尝试解决这个问题很长时间了。在给定的程序中,R被不可预测地更新,即使没有触摸它,这可以在第30行中看到,其中我打印的R是%d。同样在k循环的一些迭代之后,它显示出不可预测的行为。我不知道程序执行时出现了什么问题。请帮我做这个。提前谢谢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;
#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
}