我正在创建一个使用vigenere密码对文本进行加密的程序。但是,当我运行代码时,它会给我错误说
vigenere.c:27:29: error: multi-character character constant [-Werror,-Wmultichar]
int letternum = 'currentletter';
^
vigenere.c:27:29: error: character constant too long for its type [-Werror]
vigenere.c:26:18: error: unused variable 'currentletter' [-Werror,-Wunused-variable]
char currentletter = input[i];
^
3 errors generated.
我试图通过将char转换为int来获取用户输入的第i个字母的ascii值。我的程序代码如下。请帮助。
#include <stdio.h>
#include <cs50.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
string input;
int digitnum = 0;
int main(int argc, string argv[])
{
if (argc>2 || argc<2)
{
printf("Please enter a valid argument.\n");
return 1;
}
input = GetString();
for (int i = 0; i < strlen(input); i++)
{
char c = input[i];
if (isalpha(input[i]))
{
char currentletter = input[i];
int letternum = 'currentletter';
if(isupper(c))
{
int upper = 'A';
int alphanum = letternum - upper;
int newint = (alphanum + alphanum) % 26;
newint = newint + upper;
char newchar = newint;
printf("%c", newchar);
}
if(islower(c))
{
int lower = 'a';
int alphanum = letternum - lower;
int newint = (alphanum + alphanum) % 26;
newint = newint + lower;
char newchar = newint;
printf("%c", newchar);
}
digitnum = digitnum + 1;
if (digitnum >= strlen(argv[1]))
{
digitnum = 0;
}
}
else
{
printf("%c", input[i]);
}
}
}
答案 0 :(得分:1)
char currentletter = input[i];
int letternum = 'currentletter';
正如警告所说, 'currentletter'
是一个多字符常量。它的类型为int
,其值是实现定义的。它与您在上面的行中定义的变量currentletter
无关。
多字符常量是一种非常无用的语言功能。它们不能用于便携式代码。它们是合法的,所以一个符合标准的编译器不会拒绝它们(即使它们的值超出范围),但显然你正在调用编译器,它有一个选项导致它拒绝它们(实际上是非常好的主意)。
我最好的猜测是你应该:
char currentletter = input[i];
int letternum = currentletter;
这是合法的,但我不知道为什么你需要将currentletter
的值复制到int
对象中。 char
已经是整数类型。
我必须研究其余的代码以确定如何解决问题,但这会回答您关于错误消息的问题。
答案 1 :(得分:0)
问题是你正在尝试将字符串转换为字符。
int letternum = 'currentletter';
但是你必须将字符转换为ASCII值。为此,只需删除引号即可。然后它将转换变量 - currentletter
。如果你包含''
,它会尝试将其作为一个字符读取,因此会给你一个错误!