鱼C论坛

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

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

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

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

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

x
  1. #include <stdio.h>

  2. char *func(char n);

  3. char *func(char n){

  4.         char *p = &n;

  5.         return p;
  6. }

  7. int main(void){
  8.        
  9.         char str[] = "FishC";

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

  11.         return 0;
  12. }
复制代码


这段代码哪里有问题?
最佳答案
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()`函数,因为它仅仅返回输入的字符串。

下面是修改后的代码:

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include "md5.h"

  4. #define MAX 1024

  5. int main(void)
  6. {
  7.     int i;
  8.     char encrypt[MAX];
  9.     unsigned char decrypt[16];

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

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

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

  14.     MD5_CTX md5;
  15.     MD5Init(&md5);
  16.     MD5Update(&md5, (unsigned char*)encrypt, strlen(encrypt));
  17.     MD5Final(&md5, decrypt);

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

  23.     return 0;
  24. }
复制代码


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

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

使用道具 举报

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

下面是修改后的代码:

  1. #include <stdio.h>

  2. char* func(char* str) {
  3.     return str;
  4. }

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

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

  8.     return 0;
  9. }
复制代码


在修改后的代码中,`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 ...
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include "md5.h"

  4. #define MAX 1024

  5. char *func(char *);

  6. char *func(char *str){
  7.         return str;
  8. }
  9.                

  10. int main(void)
  11. {
  12.         int i;
  13.         unsigned char encrypt[MAX];
  14.         unsigned char decrypt[16];
  15.                
  16.                 printf("请输入密码:");
  17.                 scanf("%s", encrypt);


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

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

  20.         MD5_CTX md5;

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

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

  32.         return 0;
  33. }
复制代码


这是编译器给我的警告!
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()`函数,因为它仅仅返回输入的字符串。

下面是修改后的代码:

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include "md5.h"

  4. #define MAX 1024

  5. int main(void)
  6. {
  7.     int i;
  8.     char encrypt[MAX];
  9.     unsigned char decrypt[16];

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

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

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

  14.     MD5_CTX md5;
  15.     MD5Init(&md5);
  16.     MD5Update(&md5, (unsigned char*)encrypt, strlen(encrypt));
  17.     MD5Final(&md5, decrypt);

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

  23.     return 0;
  24. }
复制代码


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

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

使用道具 举报

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

  2. char *func(char *n) {
  3.     return n;
  4. }

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

使用道具 举报

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

  4. #define MAX 1024

  5. char *func(char *);

  6. char *func(char *str){
  7.         return str;
  8. }
  9.                

  10. int main(void)
  11. {
  12.         int i;
  13.         char encrypt[MAX];
  14.         char decrypt[16];
  15.                
  16.                 printf("请输入密码:");
  17.                 scanf("%s", encrypt);


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

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

  20.         MD5_CTX md5;

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

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

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

使用道具 举报

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

  4. #define MAX 1024

  5. int main(void) {
  6.     int i;
  7.     char encrypt[MAX];
  8.     char decrypt[16];

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

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

  13.     MD5_CTX md5;

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

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

  24.     return 0;
  25. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> 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-4-27 16:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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