我在Code Wars上练习,但我遇到了一个奇怪的问题。省略一些细节:任务是将每个数字的补码替换为9,并将每个字母移动一个给定的数字。为此,我做了这个循环,我认为应该根据其ANSI代码表示更改每个字符:
char *str = "ABC 123!"; // example
int n = 1; // example
for (char *c = str; *c; c++) {
printf("Before: *c = %d\n", *c);
if (*c > 47 && *c < 58) {
*c = 105 - *c;
// replace digit
}
if (*c > 64 && *c < 91) {
*c = (*c - 64 + number) % 26 + 64;
// replace letter
}
printf("After: *c = %d\n", *c);
}
我已经在各个地方做了各种日志声明,我可以从中判断出某些条件检查失败并且我不进入if
块,而其他成功,我做进入if
块,但是当我遇到*c = ...;
语句时,测试崩溃(也尝试在单独的IDE中运行相同的代码) ,但执行仍然突然停止)。
为什么会发生这种情况?
答案 0 :(得分:1)
尝试修改字符串文字有undefined behavior 。在你的情况下程序停止,因为你试图修改不可修改的。 (通常它放在.rodata
部分 - 只读)。但是,直接修改char
的可变数组,或通过指针修改不是未定义的行为,甚至
虽然它的初始化程序是一个文字字符串。以下情况很好:
char str[] = "ABC 123!";
这就是从代码中获取正确行为所需的全部内容。我们不用二进制编写代码的原因之一是使人类可读。此处不是47
,58
使用'0'
或'9'
等,而是使用SET @cnt=0;
SELECT s.*
FROM (SELECT ( @cnt := @cnt + 1 ) AS rank,
a.*
FROM one AS a
ORDER BY a.salary DESC) AS s
WHERE s.rank = '3';
。