C编译器认为char类型是int-type-clang编译器

C编译器认为char类型是int-type-clang编译器,c,compiler-errors,type-conversion,cs50,C,Compiler Errors,Type Conversion,Cs50,因此,我正在学习计算机科学中的一门edX课程(不是为了学分,只是为了有助于自学的讲座),高级习题集与密码解密有关。为了更好地理解用于加密的函数crypt(),我编写了以下代码,以确定“salt”字符串使用了什么(终端中的man crypt()命令表示:(“salt是从集合[a-zA-Z0-9./]中选择的两个字符的字符串。此字符串用于以4096种不同方式之一干扰算法。“))请告诉我,您是否能理解我为什么会出现此错误 下面是我使用的代码。我在尝试编译时遇到此错误: test.c:37:33: er

因此,我正在学习计算机科学中的一门edX课程(不是为了学分,只是为了有助于自学的讲座),高级习题集与密码解密有关。为了更好地理解用于加密的函数crypt(),我编写了以下代码,以确定“salt”字符串使用了什么(终端中的man crypt()命令表示:(“salt是从集合[a-zA-Z0-9./]中选择的两个字符的字符串。此字符串用于以4096种不同方式之一干扰算法。“))请告诉我,您是否能理解我为什么会出现此错误

下面是我使用的代码。我在尝试编译时遇到此错误:

test.c:37:33: error: incompatible integer to pointer conversion passing 'char' to
parameter of type 'char *'; take the address with & [-Werror,-Wint-conversion]
char *salt = strcat(whatever1,whatever2);
代码:

#define XOPEN(源代码)//这是unistd和crypt所需要的
#包括
#include//this允许我执行crypt()fcn
#include//只是让我在一些输入fcn中使用string作为一种类型,由课程制作
#包括
#include//this允许我使用toascii()
char*word=“恺撒”;
字符*密码;
char toASCII_New(int i)//尝试将输入转换为十六进制,然后转换为相应的ASCII字符
{

for(int num=i;numstrcat用于连接字符串,而不是两个单独的字符。“whatever1”将连接的字符串保存在一起。当您需要做的只是拥有一个2字节的字符串时,为什么要使用-危险-strcat操作呢?只需使用类似于:

char salt[3];
salt[0]=toASCII_New(i); /* why the casting to char ? you already returned a char... */
salt[1]=toASCII_New(j);
salt[2]='\0'; /* to terminate the string properly */

以下是一些一般性建议,因为整个代码都需要重构:


函数
toASCII\u New
应重写如下:

char toASCII_New(int c)
{
    if (('A' <= c && c <= 'Z') || ('a' <= c && c <= 'z'))
        return (char)toascii(c);
    return 'a';
}
int checker(int first, int second, char salt[3])
{
    for (int i=first; i<=first+25; i++)
    {
        for (int j=second; j<=second+25; j++)
        {
            salt[0] = toASCII_New(i);
            salt[1] = toASCII_New(j);
            password = crypt(word,salt);
            if (strcmp(password,"50zPJlUFIYY0o") == 0)
                return 1;
        }
    }
    return 0;
}
int main()
{
    char salt_AA[3] = {0};
    char salt_Aa[3] = {0};
    char salt_aA[3] = {0};
    char salt_aa[3] = {0};
    int  salt_AA_OK = checker('A','A');
    int  salt_Aa_OK = checker('A','a');
    int  salt_aA_OK = checker('a','A');
    int  salt_aa_OK = checker('a','a');
    printf("AA: %s\n",salt_AA_OK? salt_AA:"failed");
    printf("Aa: %s\n",salt_Aa_OK? salt_Aa:"failed");
    printf("aA: %s\n",salt_aA_OK? salt_aA:"failed");
    printf("aa: %s\n",salt_aa_OK? salt_aa:"failed");
    return 0;
}

函数
main
应重写如下:

char toASCII_New(int c)
{
    if (('A' <= c && c <= 'Z') || ('a' <= c && c <= 'z'))
        return (char)toascii(c);
    return 'a';
}
int checker(int first, int second, char salt[3])
{
    for (int i=first; i<=first+25; i++)
    {
        for (int j=second; j<=second+25; j++)
        {
            salt[0] = toASCII_New(i);
            salt[1] = toASCII_New(j);
            password = crypt(word,salt);
            if (strcmp(password,"50zPJlUFIYY0o") == 0)
                return 1;
        }
    }
    return 0;
}
int main()
{
    char salt_AA[3] = {0};
    char salt_Aa[3] = {0};
    char salt_aA[3] = {0};
    char salt_aa[3] = {0};
    int  salt_AA_OK = checker('A','A');
    int  salt_Aa_OK = checker('A','a');
    int  salt_aA_OK = checker('a','A');
    int  salt_aa_OK = checker('a','a');
    printf("AA: %s\n",salt_AA_OK? salt_AA:"failed");
    printf("Aa: %s\n",salt_Aa_OK? salt_Aa:"failed");
    printf("aA: %s\n",salt_aA_OK? salt_aA:"failed");
    printf("aa: %s\n",salt_aa_OK? salt_aa:"failed");
    return 0;
}

你想用
toASCII\u New
做什么?我认为你首先不应该使用
toASCII
。还有,你为什么要把
char
转换成
char
(在调用
toASCII\u New
时)?像这样的细节还有很多,但它们有助于阅读和理解您的代码。C中的
string
是什么?@barakmanos在代码第4行。@Nelxiost:是的,我看到了,但请注意“是由课程制作的”注释。我们应该猜一下
string
结构是如何在那里实现的吗???
toASCII_New()
函数显示了对
char
int
和“hex值”的理解不足。函数的整个主体可以替换为
if('a'the
crypt()
函数是旧的Unix API:@MichaelBurr:因此从
crypt\u r
(可重入版本的
crypt
)的描述来看,我认为
crypy
使用
static
字符串来返回密码,对吗?是的。“返回值指向静态数据,其内容被每次调用覆盖”@MichaelBurr:好的,所以我删除了关于动态分配密码的评论。谢谢你指出:)