免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6180 | 回复: 5
打印 上一主题 下一主题

[C] 返回字符串指针的函数对二维字符数组赋值问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-11 22:32 |只看该作者 |倒序浏览
5可用积分
下面这个代码里报错说“Line 16 incompatible types in assignment”,我不知为什么会出这种问题,请各位指点,谢谢!

/* Two D array pointer assignment from string-returning functions*/

#include <stdio.h>

#define NAM 2
#define LEN 21

char * retinput(void);

int main(void){
   
    char names[NAM][LEN];
    int i;
   
    for(i = 0; i < NAM; i++){
        names = retinput(); /*报错说这里的赋值类型不匹配*/
        puts(names);
    }
   
    puts("\nDone!");
   
    getch();
    return 0;
}

char * retinput(void){
     
     char nameinput[LEN];
     char * pname = nameinput;
     
     printf("\nInput the name: ");
     
     while(gets(pname) != NULL && pname[0] != '\n')
         return pname;
}

最佳答案

查看完整内容

names[j]是names是二维数组的成员,不是指针。retinput()返回char *指针,不能直接赋值。即使names[j]是指针,也有4楼说的变量生存周期的问题:或者用静态变量

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
2 [报告]
发表于 2008-11-11 22:32 |只看该作者
原帖由 mcmay 于 2008-11-11 23:15 发表
char names[NAM][LEN];
names[j] = retinput(); /*报错说这里的赋值类型不匹配*/

names[j]是names是二维数组的成员,不是指针。retinput()返回char *指针,不能直接赋值。
即使names[j]是指针,也有4楼说的变量生存周期的问题:
你返回一个局部数组变量的指针是有严重问题的(该数组在函数返回后就不存在了)
我想你应该把names[j]作为retinput的参数传进去
void retinput(char *buf)


  1. char * retinput(char * buf, int size);  //修改函数原型

  2. int main(void)
  3. {
  4. ...
  5.     for(j = 0; j < NAM; j++){
  6.         retinput((char *)&names[j], LEN); /*修改*/
  7.         
  8.         puts(names[j]);
  9.     }
  10. ..
  11. }

  12. char * retinput(char *buf, int size) //修改
  13. {
  14.     char * pname = buf;
  15.     ...
  16. }
复制代码

或者用静态变量
  1. char * retinput(void);

  2. int main(void)
  3. {
  4.     ...
  5.     for(j = 0; j < NAM; j++){
  6.         strcpy((char *)&names[j], retinput()); /*修改*/
  7.         
  8.         puts(names[j]);
  9.     }
  10.     ...
  11. }

  12. char * retinput(void)
  13. {
  14.     static char nameinput[LEN];  //静态变量
  15.     ...
  16. }
复制代码

论坛徽章:
1
射手座
日期:2013-08-21 13:11:46
3 [报告]
发表于 2008-11-11 23:01 |只看该作者
char name[][]是一个char **
可是你的函数retinput()返回值却是char *

论坛徽章:
0
4 [报告]
发表于 2008-11-11 23:15 |只看该作者
原帖由 egmkang 于 2008-11-11 23:01 发表
char name[][]是一个char **
可是你的函数retinput()返回值却是char *

不是的,我的代码中出错那行里面的“names“本来我写的是“names”的,不过这个论坛里发帖之后显示出来就是“names”了。我现在改一下,如下:

/* Two D array pointer assignment from string-returning functions*/

#include <stdio.h>

#define NAM 2
#define LEN 21

char * retinput(void);

int main(void){
   
    char names[NAM][LEN];
    int j;
   
    for(j = 0; j < NAM; j++){
        names[j] = retinput(); /*报错说这里的赋值类型不匹配*/
        puts(names[j]);
    }
   
    puts("\nDone!";
   
    getch();
    return 0;
}

char * retinput(void){
   
    char nameinput[LEN];
    char * pname = nameinput;
   
    printf("\nInput the name: ";
   
    while(gets(pname) != NULL && pname[0] != '\n')
        return pname;
}

这样发帖之后应该会显示正常了,问题还是那个问题,为什么那一行会有那样的报错出现,谢谢!

论坛徽章:
0
5 [报告]
发表于 2008-11-11 23:27 |只看该作者
你返回一个局部数组变量的指针是有严重问题的(该数组在函数返回后就不存在了)
我想你应该把names[j]作为retinput的参数传进去
void retinput(char *buf)

论坛徽章:
1
天蝎座
日期:2013-08-25 10:27:22
6 [报告]
发表于 2008-11-11 23:40 |只看该作者
变量作用域的问题。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP