C语言 更改数组中的变量时的分割错误



我正在尝试开发一个密码程序,该程序可以根据他们可以自定义的 26 个字符的字符串更改某人的文本输入。我决定走的路线是从字母表的另一个字符串中减去其输入字符串中的各个字符值。然后,数值结果将存储在一个单独的 int 数组中,该数组将应用于他们想要密码的所有未来输入。为了方便自己,我将 26 个字符的用户输入大写,但是当我的代码在我使用的示例用户输入中达到"j"时(我唯一没有大写用于测试目的的字母(我得到一个分段错误。

代码可以在下面找到。如果我没有充分描述,我深表歉意。我对编码还很陌生,所以会尽我所能回答任何问题。

#include <cs50.h>
#include <stdio.h>
#include <ctype.h>

int main(void)
{
string x = "QWERTYUIOPASDFGHJKLZXCVBNM"; // sample user input for cipher

string y = "ABCDEFGHIjKLMNOPQRSTVUWXYZ";

int code[25];

for(int i = 0; i < 26; ++i)
{

if ((int) y[i] > 90)   // For capitalisation
{
y[i] -= 32;
}

code[i] = (int) y[i] - (int) x[i];  // creates cipher array
}
}

代码有两个问题:

  1. 你循环了 26 次,从0开始,到25结束,但你的code数组只有 25 项长int code[25],这意味着最高的索引是24(因为0是第一个索引(。要解决此问题,只需将代码数组的长度更改为 26。
  2. 变量y实际上是指向存储在程序数据 (bss( 部分中的只读数据的指针,这意味着如果您尝试修改它(在这种情况下不会发生,但如果 y 中有任何小写字母(,您正在尝试写入只读内存,这将导致另一个段错误。要解决此问题,您需要将数据复制到读写数组中,或者(我所做的(只需将大写版本存储在临时变量中。

此外,为了清楚起见,我建议将大写检查更改为if (y[i] > 'Z'),因为这将具有相同的效果,但以后更容易参考。我还重命名了变量xy以更好地指示其用途,并将 x 而不是 y 大写,因为它是包含用户输入的变量。最后,我将"string"替换为"char const *",以向编译器指示我们以后不应该被允许更改这些值(string实际上只是char *(。

#include <stdio.h>
int main(void) {
char const * cipher_alphabet = "QWERTYUIOPASDFGHJKLZXCVBNM"; // sample user input for cipher    
char const * alphabet = "ABCDEFGHIjKLMNOPQRSTVUWXYZ";
int code[26];
for(int i = 0; i < 26; ++i) {
char capitalized_letter = cipher_alphabet[i];
if (capitalized_letter > 'Z') { // capitalize
capitalized_letter -= 32;
}
code[i] = (int)alphabet[i] - (int)capitalized_letter;  // create cipher array
}
}

我会使用 c 字符串或普通的旧字符数组来存储您的字符串。我在下面做了,并将它们更改为字符数组,这解决了所有问题。

#include <stdio.h>

int main(void)
{
char x[] = "QWERTYUIOPASDFGHJKLZXCVBNM"; // sample user input for cipher
char y[] = "ABCDEFGHIjKLMNOPQRSTVUWXYZ";
int code[26];
for(int i = 0; i < 26; ++i)
{
if ((int) y[i] > 90)   // For capitalisation
{
y[i] -= 32;
}
code[i] = (int) y[i] - (int) x[i];  // creates cipher array
}
for(int i = 0; i < 26; i++) {
//added this to see what everything looks like after the work is done
printf("%d",code[i]);
}
}

此外,有助于避免过度索引数组的方法是声明一个变量并将其用于迭代,如下所示:

#define ARRAY_SIZE 26
char my_array[ARRAY_SIZE];
for(int i = 0; i < ARRAY_SIZE; i++)
//do stuff with array

相关内容

  • 没有找到相关文章