鱼C论坛

 找回密码
 立即注册
查看: 1239|回复: 6

[已解决]消除警告

[复制链接]
发表于 2020-7-30 10:05:06 | 显示全部楼层 |阅读模式
10鱼币
/*
        寻找三个字符串的最长前缀,如没有返回空字符""
        eg:输入"flower", "flow","flight"
                输出"fl"
                 
                输入"dog", "car", "mouse"
                输出""
*/
#include <stdio.h>
#include <string.h>
#define MAX 1024
char *search(char *s1,char *s2, char *s3, int min);
int main(void)
{
                int  a, b, c, min;
                void *ptr;
                char s1[MAX], s2[MAX], s3[MAX];
                printf("请输入s1字符串:");
                gets(s1);
                printf("请输入s2字符串:");
                gets(s2);
                printf("请输入s3字符串:");
                gets(s3);
               
                a = strlen(s1);
                b = strlen(s2);
                c = strlen(s3);
               
                min = a < b ? a : b;
                min = min  < c ? min : c;
               
                ptr = search(s1, s2, s3, min);
                printf("%s",ptr);
               
                return 0;
}
char *search(char *s1,char *s2, char *s3, int min)
{
                char s[MAX];
                int i = 0;
               
                for(i = 0; i < min; i++)
                {
                        if((s1[i] == s2[i]) && (s2[i] == s3[i]))
                        {
                                s[i] = s1[i];
                        }
                        else
                        {
                                break;
                        }
                }
                s[i] = '\0';
               
                if(s[0] == '\0')
                {
                        return "";
                }
                else
                {
                        return s;
                }
}

程序能运行,结果也正确,但是会出现警告:[Warning] function returns address of local variable [enabled by default]
怎么消除呢?
最佳答案
2020-7-30 10:05:07
本帖最后由 livcui 于 2020-7-30 11:14 编辑

你这里 return s 的 s 是数组地址,而这个数组会在函数结束时被销毁,所以返回了一个被销毁内存的地址,没有意义,也就报警了,

C 我不熟,编译器也没有 gets() ,你自己改改吧

这样?
  1. /*
  2.         寻找三个字符串的最长前缀,如没有返回空字符""
  3.         eg:输入"flower", "flow","flight"
  4.                 输出"fl"

  5.                 输入"dog", "car", "mouse"
  6.                 输出""
  7. */
  8. #include <stdio.h>
  9. #include <string.h>
  10. #define MAX 1024
  11. char* search(char* s1, char* s2, char* s3, int min, char*);
  12. char s[MAX];
  13. int main(void)
  14. {
  15.     int  a, b, c, min;
  16.     void* ptr;
  17.     char s1[MAX], s2[MAX], s3[MAX];
  18.     printf("请输入s1字符串:");
  19.     gets(s1);
  20.     printf("请输入s2字符串:");
  21.     gets(s2);
  22.     printf("请输入s3字符串:");
  23.     gets(s3);

  24.     a = strlen(s1);
  25.     b = strlen(s2);
  26.     c = strlen(s3);

  27.     min = a < b ? a : b;
  28.     min = min < c ? min : c;

  29.     ptr = search(s1, s2, s3, min, s);
  30.     printf("%s", ptr);

  31.     return 0;
  32. }
  33. char* search(char* s1, char* s2, char* s3, int min, char* s)
  34. {
  35.     //char s[MAX];
  36.     int i = 0;

  37.     for (i = 0; i < min; i++)
  38.     {
  39.         if ((s1[i] == s2[i]) && (s2[i] == s3[i]))
  40.         {
  41.             s[i] = s1[i];
  42.         }
  43.         else
  44.         {
  45.             break;
  46.         }
  47.     }
  48.     s[i] = '\0';

  49.     if (s[0] == '\0')
  50.     {
  51.         return '\0';
  52.     }
  53.     else
  54.     {
  55.         return s;
  56.     }
  57. }
复制代码



最佳答案

查看完整内容

你这里 return s 的 s 是数组地址,而这个数组会在函数结束时被销毁,所以返回了一个被销毁内存的地址,没有意义,也就报警了, C 我不熟,编译器也没有 gets() ,你自己改改吧 这样?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-7-30 10:05:07 | 显示全部楼层    本楼为最佳答案   
本帖最后由 livcui 于 2020-7-30 11:14 编辑

你这里 return s 的 s 是数组地址,而这个数组会在函数结束时被销毁,所以返回了一个被销毁内存的地址,没有意义,也就报警了,

C 我不熟,编译器也没有 gets() ,你自己改改吧

这样?
  1. /*
  2.         寻找三个字符串的最长前缀,如没有返回空字符""
  3.         eg:输入"flower", "flow","flight"
  4.                 输出"fl"

  5.                 输入"dog", "car", "mouse"
  6.                 输出""
  7. */
  8. #include <stdio.h>
  9. #include <string.h>
  10. #define MAX 1024
  11. char* search(char* s1, char* s2, char* s3, int min, char*);
  12. char s[MAX];
  13. int main(void)
  14. {
  15.     int  a, b, c, min;
  16.     void* ptr;
  17.     char s1[MAX], s2[MAX], s3[MAX];
  18.     printf("请输入s1字符串:");
  19.     gets(s1);
  20.     printf("请输入s2字符串:");
  21.     gets(s2);
  22.     printf("请输入s3字符串:");
  23.     gets(s3);

  24.     a = strlen(s1);
  25.     b = strlen(s2);
  26.     c = strlen(s3);

  27.     min = a < b ? a : b;
  28.     min = min < c ? min : c;

  29.     ptr = search(s1, s2, s3, min, s);
  30.     printf("%s", ptr);

  31.     return 0;
  32. }
  33. char* search(char* s1, char* s2, char* s3, int min, char* s)
  34. {
  35.     //char s[MAX];
  36.     int i = 0;

  37.     for (i = 0; i < min; i++)
  38.     {
  39.         if ((s1[i] == s2[i]) && (s2[i] == s3[i]))
  40.         {
  41.             s[i] = s1[i];
  42.         }
  43.         else
  44.         {
  45.             break;
  46.         }
  47.     }
  48.     s[i] = '\0';

  49.     if (s[0] == '\0')
  50.     {
  51.         return '\0';
  52.     }
  53.     else
  54.     {
  55.         return s;
  56.     }
  57. }
复制代码



小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-7-30 10:48:19 From FishC Mobile | 显示全部楼层
把s的声明放到主函数里边
search改为无返回值,向search传入s
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-7-30 10:50:18 | 显示全部楼层

  1. /*
  2.         寻找三个字符串的最长前缀,如没有返回空字符""
  3.         eg:输入"flower", "flow","flight"
  4.                 输出"fl"
  5.                  
  6.                 输入"dog", "car", "mouse"
  7.                 输出""
  8. */
  9. #include <stdio.h>
  10. #include <string.h>
  11. #define MAX 1024
  12. char *search(char *s1,char *s2, char *s3, int min, char *s);
  13. int main(void)
  14. {
  15.                 int  a, b, c, min;
  16.                 void *ptr;
  17.                 char s1[MAX], s2[MAX], s3[MAX], s[MAX];
  18.                 printf("请输入s1字符串:");
  19.                 gets(s1);
  20.                 printf("请输入s2字符串:");
  21.                 gets(s2);
  22.                 printf("请输入s3字符串:");
  23.                 gets(s3);
  24.                
  25.                 a = strlen(s1);
  26.                 b = strlen(s2);
  27.                 c = strlen(s3);
  28.                
  29.                 min = a < b ? a : b;
  30.                 min = min  < c ? min : c;
  31.                
  32.                 ptr = search(s1, s2, s3, min, s);
  33.                 printf("%s",ptr);
  34.                
  35.                 return 0;
  36. }
  37. char *search(char *s1,char *s2, char *s3, int min, char *s)
  38. {
  39.                 //char s[MAX];
  40.                 int i = 0;
  41.                
  42.                 for(i = 0; i < min; i++)
  43.                 {
  44.                         if((s1[i] == s2[i]) && (s2[i] == s3[i]))
  45.                         {
  46.                                 s[i] = s1[i];
  47.                         }
  48.                         else
  49.                         {
  50.                                 break;
  51.                         }
  52.                 }
  53.                 s[i] = '\0';
  54.                
  55.                 if(s[0] == '\0')
  56.                 {
  57.                         return "";
  58.                 }
  59.                 else
  60.                 {
  61.                         return s;
  62.                 }
  63. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-7-30 11:30:16 | 显示全部楼层
livcui 发表于 2020-7-30 10:39
你这里 return s 的 s 是数组地址,而这个数组会在函数结束时被销毁,所以返回了一个被销毁内存的地址,没 ...

对的,不过没有公共前缀会返回NULL,58行改成return “”就好了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-7-30 11:33:34 | 显示全部楼层
巴巴鲁 发表于 2020-7-30 11:30
对的,不过没有公共前缀会返回NULL,58行改成return “”就好了

我用的C++,会报错,所以才改了



设置个最佳吧
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-7-30 11:45:05 | 显示全部楼层
Unicorn# 发表于 2020-7-30 10:48
把s的声明放到主函数里边
search改为无返回值,向search传入s

感谢感谢,让我又知道了无返回值函数
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-15 06:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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