鱼C论坛

 找回密码
 立即注册
查看: 914|回复: 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() ,你自己改改吧

这样?
/*
        寻找三个字符串的最长前缀,如没有返回空字符""
        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, char*);
char s[MAX];
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, s);
    printf("%s", ptr);

    return 0;
}
char* search(char* s1, char* s2, char* s3, int min, char* s)
{
    //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 '\0';
    }
    else
    {
        return s;
    }
}


最佳答案

查看完整内容

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

使用道具 举报

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

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

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

这样?
/*
        寻找三个字符串的最长前缀,如没有返回空字符""
        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, char*);
char s[MAX];
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, s);
    printf("%s", ptr);

    return 0;
}
char* search(char* s1, char* s2, char* s3, int min, char* s)
{
    //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 '\0';
    }
    else
    {
        return s;
    }
}


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

使用道具 举报

发表于 2020-7-30 10:48:19 From FishC Mobile | 显示全部楼层
把s的声明放到主函数里边
search改为无返回值,向search传入s
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-30 10:50:18 | 显示全部楼层
/* 
        寻找三个字符串的最长前缀,如没有返回空字符"" 
        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, char *s);
int main(void)
{
                int  a, b, c, min;
                void *ptr;
                char s1[MAX], s2[MAX], s3[MAX], s[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, s);
                printf("%s",ptr);
                
                return 0;
} 
char *search(char *s1,char *s2, char *s3, int min, char *s)
{
                //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;
                }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

对的,不过没有公共前缀会返回NULL,58行改成return “”就好了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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



设置个最佳吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

感谢感谢,让我又知道了无返回值函数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-13 10:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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