在多次尝试编写此程序后,我完全从正在阅读的书中复制了此内容。我继续遇到相同的细分错误。
调试器说“无法访问地址0x7ffffffff000的内存”,它是sMessage [0]的地址。我不确定为什么我不能访问数组的内容。
最后,请原谅我可怕的格式。这是我第一次问一个问题。
DEFINE_
答案 0 :(得分:0)
“ \ 0”(双引号)和“ \ 0”(单引号)之间存在巨大差异。第一个是指向“字符串”文字的常量(常量),第二个是字符文字的常量。一个是指向char(acter)的指针,另一个是char(acter)。
执行此操作以说明:
printf("%p\n", "\0");
printf("%d\n", '\0');
您可以互换使用它们( Python,Ruby,Perl和R基本上允许这样做),第一个是不正确的,第二个是正确的。
//don't do this
while (sMessage[x] != "\0") {
sMessage[x] += random;
x++;
}
//do this
while ('\0' != sMessage[x]) {
sMessage[x] -= random;
x++;
}
实际上,最好的办法是定义一个常量(#define或const),
#define EOS ('\0')
const char EOS = ('\0');
while (EOS != sMessage[x]) { //this is why I prefer #define literal
请注意,Ruby和Perl允许在双引号字符串上使用字符串'interpolation',而不允许在单引号字符串上使用字符串'interpolation'。
但更重要的是要防止走开字符串的结尾,因此传递sMessage的长度,并在遍历数组时进行检查。这就是为什么存在for(;;)重复结构的原因。
void encrypt(char buffer[], size_t len, int random)
...
for( x=0; x<len && (EOS != sMessage[x]; ++x ) {
答案 1 :(得分:0)
在选项1和2中,提示用户输入您正在执行的字符串:
scanf("%s", &iSelection);
这显然是错误的,因为iSelection
变量是int
,但是"%s"
格式说明符需要一个字符串。我想您是想这样做:
scanf("%s", myString);