黑马程序员技术交流社区

标题: 查找最大字符串的题,帮我看一下哪里有问题。谢谢 [打印本页]

作者: 兰闻天    时间: 2014-4-28 20:19
标题: 查找最大字符串的题,帮我看一下哪里有问题。谢谢
本帖最后由 兰闻天 于 2014-4-30 10:45 编辑

/*
5、 在一个已知的字符串中查找最长单词,假定字符串中只含字母和空格,空格用来分隔不同单词。(C语言)
*/
#import <stdio.h>
#import <string.h>
char * MaxChar(char *string)
{
    char *result;
    char str[50][50];
    int j=0,k=0;
    //计算字符串的长度
    int length = strlen(string);
    for (int i=0; i<=length; i++) {
        if ( *(string+i)) {
            if (' ' == *(string+i)) {
                str[j][ i]='\0';
                j++;k=0;
            }else
            {
                str[j][k]=*(string+i);
                k++;
            }
        }
        else
        {
            str[j][k]='\0';
        }
        
    }
    int u=0;
    for (int m=1; m<=j; m++) {
        
        if(strlen(str[ u]) < strlen(str[m]))
        {
            u=m;
        }
    }
    return &str[ u];
}
int main()
{
    //定义一个已知字符串
    char *string="I am a people sjdfkas jkejwkfajkdshfk hfkajfhds";
    //
    char *result = MaxChar( string );
    printf("%s\n",result);
    return 0;
}
编译链接后两个警告
5-测试题5.c:38:12: warning: incompatible pointer types returning
      'char (*)[50]' from a function with result type 'char *'
      [-Wincompatible-pointer-types]
    return &str;
           ^~~~~~~
5-测试题5.c:38:13: warning: address of stack memory associated with local
      variable 'str' returned [-Wreturn-stack-address]
    return &str;
            ^~~
2 warnings generated.
查看结果返回的不全:jkejwk
return &str [  u]; 变成
return str[ u];
测试题5.c:43:12: warning: address of stack memory associated with local
      variable 'str' returned [-Wreturn-stack-address]
    return str;
           ^~~
1 warning generated.


作者: dawn.dai    时间: 2014-4-28 21:03
本帖最后由 dawn.dai 于 2014-4-28 21:30 编辑

                        
#import <stdio.h>
#import <string.h>
char * MaxChar(char *string)
{
    char *result;
    char str[50][50];
    int j=0,k=0;
    //计算字符串的长度
    unsigned long length = strlen(string);//int范围太小
    for (int i=0; i<=length; i++) {
        if ( *(string+i)) {
            if (' ' == *(string+i)) {
                str[j]='\0';
                j++;k=0;
            }else
            {
                str[j][k]=*(string+i);
                k++;
            }
        }
        else
        {
            str[j][k]='\0';
        }

    }
    //int u=0;
    result =(char *)str;//我强转了一下,就没有警告了
    for (int m=1; m<=j; m++) {

        if(strlen(result) < strlen(str[m]))
        {
            result=str[m];
        }
   
    }
    return result;
}
int main()
{
    //定义一个已知字符串
    char *string="I am a people sjdfkas jkejwkfajkdshfk hfkajfhds";
    //
    char *result = MaxChar( string );
    printf("%s\n",result);
    return 0;
}

作者: 兰闻天    时间: 2014-4-28 21:06
dawn.dai 发表于 2014-4-28 21:03
...

我找出来显示不全了,是str[50][50]太小了,但是两个警告是怎么回事啊
作者: dawn.dai    时间: 2014-4-28 21:31
兰闻天 发表于 2014-4-28 21:06
我找出来显示不全了,是str[50][50]太小了,但是两个警告是怎么回事啊

为什么我运行可以全部显示
作者: 兰闻天    时间: 2014-4-28 21:32
dawn.dai 发表于 2014-4-28 21:31
为什么我运行可以全部显示

。。。不知道
作者: 执着的土豆    时间: 2014-4-28 21:55
是类型不匹配的问题,str[u]已经是个地址了,你要再取它的地址(&str[u]),就成了数组指针类型了,即警告中所示的char (*)[50],而你的函数返回值类型是char *,所以就警告说类型不匹配。
作者: 兰闻天    时间: 2014-4-28 22:10
执着的土豆 发表于 2014-4-28 21:55
是类型不匹配的问题,str已经是个地址了,你要再取它的地址(&str),就成了数组指针类型了,即警告中所示的 ...

我这是有没有&都警告




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2