A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

例题要求:让用户从键盘输入要保存的姓名和电话号码
下面的代码是我写的,在运行的时候当我输入第一个人的姓名、电话号码后回车就好报错?这是为什么?
当我把
char*name 改为 char name[21]
char *num 改为 char  num[12]
运行就OK了,这两种定义有什么区别?
#include <stdio.h>
int main()
{
    //定义变量
    int i;
    //先定义一个结构体并且定义一个结构数组
    struct  TXL
    {
        char *name;
        char *num;
    }txl[2];

    //从键盘输入通讯录中联系人的姓名、电话号码

    //请输入联系人的姓名
    printf("请输入联系人的姓名和电话号码格式为:姓名  电话号码\n");
    for(i=0;i<2;i++)
    {
        scanf("%s %s",txl.name,txl.num);
    }

    //遍历通讯录
    printf("打印出通讯录中的内容\n");
    for(i=0;i<2;i++)
    {
        printf("姓名:%s\n电话号码:%s\n",txl.name,txl.num);
        printf("\n");
    }

}

17 个回复

倒序浏览
报错的原因  是输入方法的问题    因为你的回车被下一次循环的sanf吸收了
回复 使用道具 举报
本帖最后由 丁铭检 于 2015-7-24 22:21 编辑

这个是字符串指针问题,其区别老师在视屏中有讲到。。char *name  你定义的指针字符没有初始化,就是没有给其一个明确的指向,你这样直接的利用会有问题。所以个人建议结构体中的变量尽量不要出现指针类型变量。
回复 使用道具 举报
liusuizuoyou 发表于 2015-7-24 10:21
报错的原因  是输入方法的问题    因为你的回车被下一次循环的sanf吸收了

你这个。。还是先仔细看看基础视屏吧。。。
回复 使用道具 举报
谢谢大神很受用哦~
回复 使用道具 举报
丁铭检 发表于 2015-7-24 21:48
这个是字符串指针问题,其区别老师在视屏中有讲到。。char *name  你定义的指针字符没有初始化,就是没有给 ...

谢谢,如何不是从键盘输入,而是程序中赋值:定义为字符串指针应该是比定义为数组方便(个人认为)
因为,在初始化的时候 比如:
char *name     name="姓名"

char  name[]   strcpy(name,"姓名");
需要用函数来赋值
回复 使用道具 举报
大湿 初级黑马 2015-7-25 13:08:47
7#
因为char *name; 他只是一个指针变量,他是一个野指针,需要给分配空间,比如 char *name = (char *)malloc(100);你可以再使用name试试
回复 使用道具 举报
紫荆秋雪 发表于 2015-7-25 12:54
谢谢,如何不是从键盘输入,而是程序中赋值:定义为字符串指针应该是比定义为数组方便(个人认为)
因为 ...

定义字符数组不是一样可以直接 char name[] = "姓名";
回复 使用道具 举报
上面回答的都很详细
回复 使用道具 举报
丁铭检 发表于 2015-7-25 13:39
定义字符数组不是一样可以直接 char name[] = "姓名";

定义数组直接初始化是可以的但是,后初始化这就 不能了
回复 使用道具 举报
指针变量跟数组的区别在于,指针变量声明后就分配了存放一个地址的内存空间,数组声明后分配了存放整个数组的内存空间,sanf函数需要将输入的值存放在内存中指定的位置,而这个位置必须是正常可用的,指针变量仅仅是分配了一个空间,却并没有指定这个空间存放的地址值是多少,则他的实际值是不确定的,导致程序可能修改未知的内存数据,导致问题,运行时就不允许这类操作,报错
回复 使用道具 举报
CesC 中级黑马 2015-7-26 14:56:47
12#
你好学霸!!!
回复 使用道具 举报
同学,指针变量是需要进行初始化的,不然是野指针
回复 使用道具 举报
xiaochongzi 发表于 2015-7-26 17:01
同学,指针变量是需要进行初始化的,不然是野指针

谢谢,刚试了一下初始化,也不行会报错,我用的是VC++6.0不清楚是不是因为环境的关系?
回复 使用道具 举报
你的C语言不过关啊,
回复 使用道具 举报
用了楼主的说法 换个数组类型 结果报错为 TXL[2]不是结构体

屏幕快照 2015-08-04 10.57.42 PM.png (144.19 KB, 下载次数: 299)

屏幕快照 2015-08-04 10.57.42 PM.png
回复 使用道具 举报
哇撒 真的从上看到尾 都很专业啊 真想赶快进入黑马 与大家一起学习啊
回复 使用道具 举报
wowthe1st 发表于 2015-7-26 14:37
指针变量跟数组的区别在于,指针变量声明后就分配了存放一个地址的内存空间,数组声明后分配了存放整个数组 ...

谢谢大神!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马