鱼C论坛

 找回密码
 立即注册
查看: 552|回复: 9

[已解决]C语言 指针函数

[复制链接]
发表于 2024-3-28 15:51:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>

char *func(char n);

char *func(char n){

        char *p = &n;

        return p;
}

int main(void){
        
        char str[] = "FishC"; 

        printf("%s", func(str));

        return 0;
}

这段代码哪里有问题?
最佳答案
2024-3-28 16:01:45
liyifeng295641 发表于 2024-03-28 16:01
#include
#include
#include "md5.h"

#define  ...


这个警告是因为`func()`函数接受的参数类型是`char *`,而你传递的是`unsigned char`数组。虽然C语言中`char`和`unsigned char`都表示字符类型,但它们在指针类型上是不同的。

要修复这个警告,你可以将`encrypt`数组声明为`char`类型而不是`unsigned char`类型。另外,可以省略`func()`函数,因为它仅仅返回输入的字符串。

下面是修改后的代码:
#include <stdio.h>
#include <string.h>
#include "md5.h"

#define MAX 1024

int main(void)
{
    int i;
    char encrypt[MAX];
    unsigned char decrypt[16];

    printf("请输入密码:");
    scanf("%s", encrypt);

    printf("你输入的密码是:%s\n", encrypt);

    printf("加密的密码是:");

    MD5_CTX md5;
    MD5Init(&md5);
    MD5Update(&md5, (unsigned char*)encrypt, strlen(encrypt));
    MD5Final(&md5, decrypt);

    for (i = 0; i < 16; i++)
    {
        printf("%02x", decrypt[i]);
    }
    putchar('\n');

    return 0;
}

这样修改后代码应该能够正常运行,并且不会再有警告信息输出。希望对你有帮助!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-3-28 15:51:50 | 显示全部楼层
这段代码有几个问题。首先,在`char *func(char n)`函数中,您尝试将一个`char`类型的变量的地址赋给指针`p`,这是不正确的,因为指针应该指向一个可访问的内存位置。其次,在`main`函数中定义字符串时,应使用双引号而不是单引号来表示字符串。

下面是修改后的代码:
#include <stdio.h>

char* func(char* str) {
    return str;
}

int main(void) {
    char str[] = "FishC";

    printf("%s", func(str));

    return 0;
}

在修改后的代码中,`func`函数接受一个字符串的指针,并将其直接返回。在`main`函数中,我们定义了一个字符数组`str[]`来存储字符串,并传递它的地址给`func`函数。最后,我们使用`printf`函数打印出返回的字符串。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-28 16:01:29 | 显示全部楼层
FishC 发表于 2024-3-28 15:51
这段代码有几个问题。首先,在`char *func(char n)`函数中,您尝试将一个`char`类型的变量的地址赋给指针`p ...
#include <stdio.h>
#include <string.h>
#include "md5.h"

#define MAX 1024

char *func(char *);

char *func(char *str){
        return str;
}
                

int main(void)
{
        int i;
        unsigned char encrypt[MAX];
        unsigned char decrypt[16];
                
                printf("请输入密码:");
                scanf("%s", encrypt);


                printf("你输入的密码是:%s\n", func(encrypt));

                printf("加密的密码是:");

        MD5_CTX md5;

        // 初始化
        MD5Init(&md5);
        // 传入明文字符串及其长度
        MD5Update(&md5, encrypt, strlen((char *)encrypt));
        // 得到加密后的字符串
        MD5Final(&md5, decrypt);

        for (i = 0; i < 16; i++)
        {
                printf("%02x", decrypt[i]);
        }
        putchar('\n');

        return 0;
}

这是编译器给我的警告!
test.c:24:45: warning: passing 'unsigned char[1024]' to parameter of type 'char *' converts between pointers to integer types where one is of the unique plain 'char' type and the other is not [-Wpointer-sign]
                printf("你输入的密码是:%s\n", func(encrypt));
                                                   ^~~~~~~
test.c:9:18: note: passing argument to parameter 'str' here
char *func(char *str){
                 ^
帮我改进代码,@FishC
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-28 16:01:45 | 显示全部楼层    本楼为最佳答案   
liyifeng295641 发表于 2024-03-28 16:01
#include
#include
#include "md5.h"

#define  ...


这个警告是因为`func()`函数接受的参数类型是`char *`,而你传递的是`unsigned char`数组。虽然C语言中`char`和`unsigned char`都表示字符类型,但它们在指针类型上是不同的。

要修复这个警告,你可以将`encrypt`数组声明为`char`类型而不是`unsigned char`类型。另外,可以省略`func()`函数,因为它仅仅返回输入的字符串。

下面是修改后的代码:
#include <stdio.h>
#include <string.h>
#include "md5.h"

#define MAX 1024

int main(void)
{
    int i;
    char encrypt[MAX];
    unsigned char decrypt[16];

    printf("请输入密码:");
    scanf("%s", encrypt);

    printf("你输入的密码是:%s\n", encrypt);

    printf("加密的密码是:");

    MD5_CTX md5;
    MD5Init(&md5);
    MD5Update(&md5, (unsigned char*)encrypt, strlen(encrypt));
    MD5Final(&md5, decrypt);

    for (i = 0; i < 16; i++)
    {
        printf("%02x", decrypt[i]);
    }
    putchar('\n');

    return 0;
}

这样修改后代码应该能够正常运行,并且不会再有警告信息输出。希望对你有帮助!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-28 16:25:15 | 显示全部楼层
#include <stdio.h>

char *func(char *n) {
    return n;
}

int main(void) {
    char str[] = "FishC";
    printf("%s\n", func(str));
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-28 16:27:09 | 显示全部楼层
#include <stdio.h>
#include <string.h>
#include "md5.h"

#define MAX 1024

char *func(char *);

char *func(char *str){
        return str;
}
                

int main(void)
{
        int i;
        char encrypt[MAX];
        char decrypt[16];
                
                printf("请输入密码:");
                scanf("%s", encrypt);


                printf("你输入的密码是:%s\n", func(encrypt));

                printf("加密的密码是:");

        MD5_CTX md5;

        // 初始化
        MD5Init(&md5);
        // 传入明文字符串及其长度
        MD5Update(&md5, encrypt, strlen((char *)encrypt));
        // 得到加密后的字符串
        MD5Final(&md5, decrypt);

        for (i = 0; i < 16; i++)
        {
                printf("%02x", decrypt[i]);
        }
        putchar('\n');

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-28 16:29:00 | 显示全部楼层
#include <stdio.h>
#include <string.h>
#include "md5.h"

#define MAX 1024

int main(void) {
    int i;
    char encrypt[MAX];
    char decrypt[16];

    printf("请输入密码:");
    scanf("%s", encrypt);

    printf("你输入的密码是:%s\n", encrypt);
    printf("加密的密码是:");

    MD5_CTX md5;

    // 初始化
    MD5Init(&md5);
    // 传入明文字符串及其长度
    MD5Update(&md5, encrypt, strlen(encrypt));
    // 得到加密后的字符串
    MD5Final(&md5, decrypt);

    for(i = 0; i < 16; i++) {
        printf("%02x", decrypt[i]);
    }
    putchar('\n');

    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-28 16:45:31 | 显示全部楼层

这道题你当初咋写的
指针函数和函数指针动动手第一题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-28 16:55:27 | 显示全部楼层
liyifeng295641 发表于 2024-3-28 16:45
这道题你当初咋写的
指针函数和函数指针动动手第一题

忘了,我好像没写,^_^
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-28 18:55:29 | 显示全部楼层
人造人 发表于 2024-3-28 16:55
忘了,我好像没写,^_^

o_o
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 11:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表