gpt4 book ai didi

C - 凯撒密码 - 中止陷阱 :6 Error?

转载 作者:太空宇宙 更新时间:2023-11-04 06:57:28 27 4
gpt4 key购买 nike

我正在用 C 编写一个移位密码程序。但是,当我在字符串中输入大约 9 个字符时,它会中断并出现错误 Abort trap: 6。然而,它在用户输入少于 9 个字符时工作正常,计算函数计算密码,然后输出函数输出结果。

但是我不确定为什么它不允许用户输入 9 个字符或更多字符来进行密码转换?

这是否与指针有关,因为当我在没有函数和指针的主体中拥有所有代码时,它可以完美运行。但是,在执行计算时,如果我输入很多字符,则会出现此错误,但我不确定为什么?

主体代码

here/*Macro constant for input limit*/
#define LIMIT 79


/*function templates*/
void prompt(char * setence , int * shift);
void calculation (char * setence , int shift);
void output (char * setence);

int main ()
{

char setence[LIMIT];
int shift;

//pointers
char * sent;
int * sh;

sent = &setence[LIMIT];
sh = &shift;


/*Ask user for Setence & shift amount for fibbinachi*/
prompt(sent , sh);


/*calculate sequence */
calculation(sent , shift);

/*output new result sequence */
output(sent);

return 0; }

提示输入功能

/*function - prompt user to enter information*/
void prompt(char * setence , int * shift)
{

/*Input sentence & shift amount*/

printf("Enter a setence:\n");
gets(setence);


printf("Enter Shift Amount:\n");
scanf("%d" , &*shift);


}

计算函数

/*Function - shift string of characters by shift number*/
void calculation (char *setence , int shift)
{
/*Iterate through setence , change letter by shift amount.
If setence character == z , wrap around back through A.*/

for (int i = 0; i <= strlen(setence); i++)
{
if(setence[i] == 'z')
{
setence[i] = 'a' + (shift - 1);
}
else if (isalpha(setence[i]) && (setence[i] >= 'a' && setence[i] <='z'))
{
setence[i] += shift;
}
else if (isalpha(setence[i]) && (setence[i] >= 'A' && setence[i] <='Z'))
{
setence[i] += shift;
}
else if (setence[i] == ' ')
{
continue;

}

}

}

输出函数

e/*Function - output shifted setence*/
void output (char * setence)
{
/*Iterate and print each character of newly shifted setence array.*/

for (int i = 0; i < strlen(setence); i++)
{
printf("%c ", setence[i]);
}

}

最佳答案

当你做的时候

sent = &setence[LIMIT];

你让 sent 指向一个地方 beyond 数组 setence 的末尾。当您随后将该指针用作 gets 的目标时(永远不要曾经使用gets!)您将写出的界限,并且有未定义的行为

在你的程序中有未定义的行为会使它格式错误并且无效。

可能 发生的事情可能是您覆盖了指针 sent 本身,因此它不再指向您要求它指向的位置,您将遇到更多问题当您使用指针时。

简单的解决方案是记住数组自然会衰减为指向其第一个 元素的指针。换句话说做

prompt(setence, &shift);

和做一样

prompt(&setence[0], &shift);

关于C - 凯撒密码 - 中止陷阱 :6 Error?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42412047/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com