所以这个程序不能识别小写字母和大写字母数组中的字母。我已经浪费了太多时间想弄明白这个问题,但我就是不明白。
它似乎只能识别'a'或'a',但也不总是这样。
#include <stdio.h>
#include <cs50.h>
#include <stdlib.h>
#include <ctype.h>
char ALPHABETLower[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
char ALPHABETUpper[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};
string plaintext = "abcdefghijklmnoprstquvwyzABCDEFGHIJKLMNOPRSTQUVWXYZ";
int i;
int j;
int main(void) {
for(i = 0; plaintext[i] != 0; i++) {
for(j = 0; plaintext[i] == ALPHABETUpper[j]; j++)
printf("%cn", ALPHABETUpper[j]);
for(j = 0; plaintext[i] == ALPHABETLower[j]; j++)
printf("%cn", ALPHABETLower[j]);
}
}
首先,我认为你只需要在你的程序中包含stdio.h
。
然后你有string plainText = "...";
,但你应该有char* plainText = "...";
,因为这是你在C语言中制作字符串的方式(我不知道你所有的库是否都是为了制作string
变量,但最简单和正确的制作字符串的方法就像我做的那样,用char
)。
那么你在你的第一个for
循环i = 0; plaintext[i] != 0; i++
,所以你可以停止当字符串结束,但我不认为这真的有效,你可以做到的最好的方法是i = 0; i < 52; i++
。
你在其他for
循环中有另一个问题。你试图在for
循环中做一个条件语句,我认为这甚至是不可能的(在while
循环中你可以)。也许这些for循环应该是这样的:
#define MaxLetters 52
#define AlphabetLetters 26
(. . .)
int main(void)
{
(. . .)
for(i = 0; i < MaxLetters; i++) { //52 letters in total on plainText string
for(j = 0; j < AlphabetLetters; j++) //26 letters in total on ALPHABETUpper
{
if(plainText[i] == ALPHABETUpper[j])
printf("%cn", ALPHABETUpper[j]);
}
for(j = 0; j < AlphabetLetters; j++) //26 letters in total on ALPHABETLower
{
if(plainText[i] == ALPHABETLower[j])
printf("%cn", ALPHABETLower[j]);
}
(. . .)
}
所以我努力完成,这是完整的工作版本。我之前的错误是让for循环无限地运行,除非它能在字母表中找到字符。
#include <stdio.h>
#include <cs50.h>
#include <stdlib.h>
#include <ctype.h>
char ALPHABETLower[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
char ALPHABETUpper[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};
string plaintext;
int i;
int j;
int main(int argc, string argv[2]) {
for(i = 0; argv[1][i] != 0; i++)
if(argv[1][i] < 48 || argv[1][i] > 57) {
printf("Usage: ./caesar keyn");
return 1;
}
plaintext = get_string("Plaintext: n");
for(i = 0; plaintext[i] != 0; i++) {
if(isalpha(plaintext[i]) == 0)
printf("%c", plaintext[i]);
for(j = 0; j < 26; j++) {
if(plaintext[i] == ALPHABETUpper[j])
printf("%c", ALPHABETUpper[(j + atoi(argv[1])) % 26]);
if(plaintext[i] == ALPHABETLower[j])
printf("%c", ALPHABETLower[(j + atoi(argv[1])) % 26]);
}
}
}