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;
}