如何在此简单的加密程序中解决段分割错误?

时间:2018-06-19 22:42:12

标签: c arrays pointers encryption

在多次尝试编写此程序后,我完全从正在阅读的书中复制了此内容。我继续遇到相同的细分错误。

这是本书,第7章:指针程序。 https://www.barnesandnoble.com/p/c-programming-for-the-absolute-beginner-michael-vine/1101415261/2678286102503?st=PLA&sid=BNB_DRS_New+Marketplace+Shopping+Textbooks_00000000&2sid=Google_&sourceId=PLGoP211448&gclid=CjwKCAjw06LZBRBNEiwA2vgMVU96G7-LHaUncLG9FGCb6hq96xniJRdf0InjdEqM7qFs4-ETXXwzURoC3lYQAvD_BwE

调试器说“无法访问地址0x7ffffffff000的内存”,它是sMessage [0]的地址。我不确定为什么我不能访问数组的内容。

最后,请原谅我可怕的格式。这是我第一次问一个问题。

DEFINE_

2 个答案:

答案 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);