C 中的 Vigenere 密码
Vigénere Cipher in C
#include <stdio.h>
#include <string.h> // strlen()
#include <ctype.h> // isupper() , tolower()
void vigenereCipher(char* plainText, char* key);
int main(int argc, char argv[])
{
char* key = argv[1];
char plainText[101];
// Ask the user for a sentence/word to encrypt
printf("Please enter a word or sentence: ");
fgets(plainText, sizeof(plainText), stdin);
// Print the used encryption key
printf("Your encryption key: %s\n", key);
// Print the encrypted plaintext
printf("Your encrypted message is: ");
vigenereCipher(plainText, key);
return 0;
}
void vigenereCipher(char* plainText, char* key)
{
int i;
char cipher;
char cipherValue;
int len = strlen(key);
// Loop through the length of the plainText string
for (i = 0; i < strlen(plainText); i++)
{
if (islower(plainText[i]))
{
cipherValue = ((int)plainText[i] - 97 + (int)tolower(key[i % len]) - 97) % 26 + 97;
cipher = (char)cipherValue;
}
else
{
cipherValue = ((int)plainText[i] - 65 + (int)toupper(key[i % len]) - 65) % 26 + 65;
cipher = (char)cipherValue;
}
// Print the ciphered character if it is alpha numeric
if (isalpha(plainText[i]))
{
printf("%c", cipher);
}
else
{
printf("%c", plainText[i]);
}
}
}
vigenere.c:7:5: error: second parameter of 'main' (argument array)
must be of type 'char **' int main(int argc, char argv[])
^ vigenere.c:10:15: error: incompatible integer to pointer conversion initializing 'char ' with an expression of type 'char';
take the address with & [-Werror,-Wint-conversion]
char key = argv[1];
^ ~~~~~~~
& 2 errors generated.
我的目标是将程序的 encryption
键作为参数提供给程序,但出现了上面的 2 个错误,并且不知道从哪里开始。有任何想法吗? (代码段结束)
这是针对 CS50
项目的。
main()
的标准签名是字符指针数组:
int main(int argc, char* argv[])
或者,如果您更喜欢指向字符的其他指针的指针:
int main(int argc, char** argv)
你得到的是一个字符数组。
您在 main
中漏掉了一个星号 *
。 main
的第二个参数是char
个指针数组:char *argv[]
.
请注意,由于数组在将其传递给函数时会衰减为指针,因此将第二个参数写为也是有效的:
char **argv
.
因此,您的 main()
应该是:
int main(int argc, char *argv[])
{
...
}
#include <stdio.h>
#include <string.h> // strlen()
#include <ctype.h> // isupper() , tolower()
void vigenereCipher(char* plainText, char* key);
int main(int argc, char argv[])
{
char* key = argv[1];
char plainText[101];
// Ask the user for a sentence/word to encrypt
printf("Please enter a word or sentence: ");
fgets(plainText, sizeof(plainText), stdin);
// Print the used encryption key
printf("Your encryption key: %s\n", key);
// Print the encrypted plaintext
printf("Your encrypted message is: ");
vigenereCipher(plainText, key);
return 0;
}
void vigenereCipher(char* plainText, char* key)
{
int i;
char cipher;
char cipherValue;
int len = strlen(key);
// Loop through the length of the plainText string
for (i = 0; i < strlen(plainText); i++)
{
if (islower(plainText[i]))
{
cipherValue = ((int)plainText[i] - 97 + (int)tolower(key[i % len]) - 97) % 26 + 97;
cipher = (char)cipherValue;
}
else
{
cipherValue = ((int)plainText[i] - 65 + (int)toupper(key[i % len]) - 65) % 26 + 65;
cipher = (char)cipherValue;
}
// Print the ciphered character if it is alpha numeric
if (isalpha(plainText[i]))
{
printf("%c", cipher);
}
else
{
printf("%c", plainText[i]);
}
}
}
vigenere.c:7:5: error: second parameter of 'main' (argument array) must be of type 'char **' int main(int argc, char argv[]) ^ vigenere.c:10:15: error: incompatible integer to pointer conversion initializing 'char ' with an expression of type 'char'; take the address with & [-Werror,-Wint-conversion] char key = argv[1]; ^ ~~~~~~~ & 2 errors generated.
我的目标是将程序的 encryption
键作为参数提供给程序,但出现了上面的 2 个错误,并且不知道从哪里开始。有任何想法吗? (代码段结束)
这是针对 CS50
项目的。
main()
的标准签名是字符指针数组:
int main(int argc, char* argv[])
或者,如果您更喜欢指向字符的其他指针的指针:
int main(int argc, char** argv)
你得到的是一个字符数组。
您在 main
中漏掉了一个星号 *
。 main
的第二个参数是char
个指针数组:char *argv[]
.
请注意,由于数组在将其传递给函数时会衰减为指针,因此将第二个参数写为也是有效的:
char **argv
.
因此,您的 main()
应该是:
int main(int argc, char *argv[])
{
...
}