所以,我有一个项目,我必须从cin输入一个字符串到一个奇数数组,然后从中心开始,"旋出"顺时针并打印加密的消息。
在大多数情况下,我的工作正常。但是,它为某些输入打印任意垃圾,我无法弄清楚原因。大多数"有问题"输入似乎有*和空格,但即使是一些更简单的输入也会给我带来麻烦。
一些"坏例子"是:
"* * ** * * ** * ** *** ** ** **"
"**************************************************************************************"
"********** "
"hello world how are you doing?"
(""
在尝试运行时遗漏了,我只是把他放在那里,这样你就可以看到每个测试的开始和结束了)
到目前为止,这是我的代码:
#include <iostream>
#include <string>
#include <cmath>
#include <cstdlib>
using namespace std;
int main()
{
string message;
int direction=0; //right = 0, down = 1, left = 2, up = 3
int n, size, i = 0;
char data[33][33];
int x, y;
int stepCount=1, numStep =0;
getline(cin, message);
n = message.size();
size = sqrt(n);
x = y = size/2 + 0.5;
if(size*size < n){
size++;
}
if(size%2 == 0){
size++;
}
for(int r=0; r < size; r++){
for(int c=0; c < size; c++){
data[r][c] = message[i];
if(!message[i]){
data[r][c] = '*';
}
i++;
}
}
for(int a=0; a<size*size; a++){
cout << data[x][y];
switch(direction){
case 0: y += 1;
break;
case 1: x+= 1;
break;
case 2: y -= 1;
break;
case 3: x -= 1;
break;
}
numStep++;
if(numStep == stepCount){
direction = (direction+1)%4;
numStep = 0;
}
if(x == y){
stepCount++;
}
}
return 0;
}
答案 0 :(得分:2)
填充data[r][c]
的循环可以访问message
中不存在的元素,因为size*size
如果其中一个条件增加message.size()
将大于size
} 是真的。您需要检查i
是否在邮件之外。
if (!message[i])
不是检查此方法的正确方法;在i > message.size()
时,message[i]
的结果未定义,而不是false
。
for(int r=0; r < size; r++){
for(int c=0; c < size; c++){
data[r][c] = i < n ? message[i] : '*';
i++;
}
}