我对编码很陌生,我一直在教自己如何使用EDX.org进行编码。本周我一直在研究密码学,我必须创建一个Vigenère的密码。我编写了代码,但大多数情况下,这是正确的。然而,当我编译程序时,它显示了分段错误。我一直在试图弄清楚为什么会这样,我完全陷入困境。你能看看我的代码并告诉我什么错了吗?
#include <stdio.h>
#include <stdlib.h>
#include <cs50.h>
#include <string.h>
#include <ctype.h>
int index(int k, int c);
int main (int argc, string argv[1])
{
//check for correct criteria
if (argc = 2, isalpha(argv[1]))
{
string text = GetString();
string key = argv[1]; //store key word
int Totalshift = strlen(key); //number of shift for keyword
int shift = 0;
//loops over the whole text
for (int i = 0, n = strlen(text); i <n; i++ )
{
char p= text[i];
char k = toupper(key[shift]); //Upper case for each character
if (isupper(p))
{
//convert to 0 index
p = p - 65;
k = k - 65;
int crypt= index (k , p);
printf("%c", crypt+65);
shift= (shift+1) %Totalshift;
}
else if (islower(p))
{
p = p - 97;
k = k - 65;
int crypt= index (k , p);
printf("%c", crypt+97);
shift= (shift+1) %Totalshift;
}
else
{
printf("%c", p);
}
}
printf("\n");
}
//error message
else
{
printf("ERROR!\n");
return 1;
}
}
//index function
int index(int k, int p)
{
return (k+p)% 26;
}
答案 0 :(得分:1)
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
NSNotificationCenter.defaultCenter().addObserver(self, selector: "stopAnim", name: "kStopAnimations", object: nil)
}
//...Your stopAnim method
//... More Code
}
class SecondViewController : UIViewController{
override func viewDidLoad() {
NSNotificationCenter.defaultCenter().postNotificationName("kStopAnimations", object: nil)
}
}
不。 永远不要隐藏指针。
string
然后:
int main(int argc, char ** argv)
在这里,你将分配给变量(参数在这方面的行为就像局部变量)值//check for correct criteria
if (argc = 2, isalpha(argv[1]))
,从而破坏了先前的值(它保存了给予的参数数量)程序)。结果是分配的值,因此2
。然后,有comma operator:您放弃2
,然后拨打2
,这清楚地说明了应该始终打开警告的原因永远不要隐藏指针:
isalpha(argv[1])
的类型为argv[1]
,因此指针指向字符数组(或者,在本例中,我们知道以{{1}结尾的字符数组},称为 C字符串)。由于char *
takes an int
as parameter指针的值(&#34;内存地址&#34;)被隐式转换为(可能非常大)'\0'
值。引用上面的链接,强调我的:
c参数是一个int,应用程序应确保的值可以表示为unsigned char或等于宏EOF的值。如果参数具有任何其他值,行为未定义。
可能是分段错误的来源。
最后,isalpha
对我来说真的很可疑。假设它分配了一些内存(对于可能从用户那里读取的字符串)...你在哪里免费那个内存?它是真的分配内存,还是可能返回一个指向具有自动存储持续时间的数组的指针(一个局部变量,可以这么说)?