我正在尝试解决UVa问题11956 (Brainf**k),并且我的解决方案有效,但仅在调试时才有效。运行该解决方案时,两种情况下我得到的结果都是相同的。
总结我要解决的问题:
正如我所说,我在CLion中逐步执行了程序,并获得了正确的输出,但运行时的最终答案两次返回相同的输出。
我正在使用C ++ 11
#include <cstdio>
#include <cstring>
using namespace std;
int main() {
int tc, Case = 0;
scanf("%d", &tc);
while (tc--) {
char line[100001] = {};
int pointer = 0;
unsigned char mem[100] = {0};
scanf("%s", &line);
for (int j = 0; j < strlen(line);j++) {
switch (line[j]) {
case '+': mem[pointer]++; break;
case '-': mem[pointer]--; break;
case '>': pointer++ ; break;
case '<': pointer-- ; break;
}
pointer = (pointer + 100) % 100;
}
printf("Case %d:", ++Case);
for (unsigned char &hex : mem) {
printf(" %02X", hex);
}
printf("\n");
}
return 0;
}
示例输入很大,所以我留下了一个粘贴
正确的输出是:
Case 1: 2B 2E 31 34 37 3A 3D 40 43 46 49 4C 4F 52 55 58 5B 5E 61 64 67 6A 6D 70 73 76 79 7C 7F 82 85 88 8B 8E 91 31 72 99 9C 9F A2 A5 A8 AB AE B1 B4 B7 BA BD C0 C3 C6 C9 CC CF D2 D5 D7 D9 DB DD DF E1 E3 E5 E7 E9 EB ED EF F1 F3 F5 F7 F9 FB FD FF 01 03 05 07 09 0B 0D 0F 11 13 15 17 19 1B 1D 1F 21 23 25 27 29
Case 2: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F 60 61 62 63
我得到:
Case 1: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F 60 61 62 63
Case 2: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F 60 61 62 63
答案 0 :(得分:-1)
无默认退出并且没有诊断是不好的,因为您不能保证输入正确,错误的操作可能会导致UB(指针-,指针为0时)。 同样,您以C方式而不是C ++方式传递数组指针。但是我无法使用提供的粘贴进行复制。输入的内容可能是流浪汉吗?
我的更改:
if(scanf("%s", &(line[0])) < 1) {
printf("Input read error.\n");
return 1;
}
for (size_t j = 0; j < strlen(line);j++) {
switch (line[j]) {
case '+': mem[pointer]++; break;
case '-': mem[pointer]--; break;
case '>': pointer++ ; break;
case '<': pointer-- ; break;
default:
printf("Character %ld: %c is invalid\n", j, line[j]);
return 1;
}