多字符字符常量错误

时间:2016-03-20 19:14:30

标签: c cs50 vigenere

我正在创建一个使用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]);
        }
    }
}

2 个答案:

答案 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。如果你包含'',它会尝试将其作为一个字符读取,因此会给你一个错误!