c-我做错了什么?(分段故障)

  • 本文关键字:分段 故障 错了 c cs50
  • 更新时间 :
  • 英文 :


Caesar从cs50中编译了pset2,但最后显示了一个错误。我做错了什么?我运行了debug50,它显示错误与密码串有关,但我仍然很困惑。

#include <cs50.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
string rotate (string text  , int key )
{
string cipher = 0;
for (int i = 0; i < strlen(text); i++)
{
if (isalpha(text[i]))
{
cipher[i] = text[i] + key;
}
if (!isalpha(cipher[i]))
{
cipher[i] = cipher[i] - 26;
}
return cipher;
}
int main(int argc, string argv[])
{
if (argc != 2)
{
printf("Usage: ./caesar keyn");
return 1;
}
for(int i = 0; i < strlen(argv[1]); i++)
{
if(!isdigit(argv[1][i]))
{
printf("Usage: ./caesar keyn");
return 1;
}
}
int key = atoi(argv[1]);
string text = get_string("Plaintext:  ");
printf("Ciphertext: %s ", rotate(text, key));

}

您的代码没有正确缩进。在rotate函数的末尾缺少},导致main函数被定义在rotate函数的主体内。丢失的}实际上在for块的末尾:return cipher;应该在这个块之外。

注意这些其他问题:

  • 您永远不会分配cipher字符串。

  • 您应该区分大小写字母,并使用%运算符来处理大于'Z' - key的字母。

这是一个修改后的版本:

#include <cs50.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *rotate(const char *text, int key) {
char *cipher = strdup(text);
for (size_t i = 0; text[i] != ''; i++) {
unsigned char ch = text[i];
if (isupper(ch)) {
cipher[i] = 'A' + (ch - 'A' + key) % 26;
} else
if (islower(ch)) {
cipher[i] = 'a' + (ch - 'a' + key) % 26;
}
cipher[i] = ch;
}
return cipher;
}
int main(int argc, char *argv[]) {
char *keystr, *p;
if (argc != 2) {
printf("Usage: ./caesar keyn");
return 1;
}
char *keystr = argv[1];
char *p;
int key = strtol(keystr, &p, 0);
if (p == keystr || *p != '') {
printf("caesar: invalid key: %sn", keystr);
return 1;
}
char *text = get_string("Plaintext:  ");
char *cipher_text = rotate(text, key);
printf("Ciphertext: %sn", cipher_text);
free(cipher_text);
return 0;
}

最新更新