| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 873 人关注过本帖
标题:狠简单的指针数组存储出错
只看楼主 加入收藏
笨女孩
Rank: 1
等 级:新手上路
帖 子:58
专家分:0
注 册:2011-7-13
收藏
得分:0 
回复 6楼 QQ346957135
能具体点吗?我不太懂!求详解
2011-09-01 13:10
Luminal
Rank: 6Rank: 6
等 级:侠之大者
帖 子:140
专家分:470
注 册:2011-8-24
收藏
得分:0 
这回不会杯具了!
会楼主的问题!
首先呢,要搞清楚 gets()的用法,如果书上没有,就百度,谷歌都可以
【1】函数:gets(字符指针)
  【2】头文件:string.h(c中),c++不需包含此头文件
  【3】原型:char *gets( char *buffer );
  【4】功能:从stdin流中读取字符串,直至接受到换行符或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中。换行符不作为读取串的内容,读取的换行符被转换为null值,并由此来结束字符串。
  【5】返回值:读入成功,返回与参数buffer相同的指针;读入过程中遇到EOF(End-of-File)或发生错误,返回NULL指针。所以在遇到返回值为NULL的情况,要用ferror或feof函数检查是发生错误还是遇到EOF。
  【6】注意:本函数可以无限读取,不会判断上限,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。如果溢出,多出来的字符将被写入到缓冲区后面的内存位置,这将破坏一个或多个不相关变量的值。这个事实导致gets函数只适用于玩具程序
[来源:百度百科]
有了原型我们就知道怎么用他了
gets(字符型内存地址buffer);把从键盘输入的内容写到从buffer所指的地址开始以后的空间中!
所以,你的 gets(name[i]); 根据你程序中的定义
char *name[3]; 这是什么? 按优先顺序结合一下 char*(name[3]) 对吧?
首先定义了一个name[3]数组,这个数组是存放的是指针,该指针所指地址的内容是char型数据,
所以name[3]里分别存放了3个地址!!但由于你没有给name数组初始化,所以此时里面的数据是什么?只能回答说:不知道这些地址是指向哪里 的!
所以编译可以通过,执行就会有问题,运气好的好不会报错,运气不好程序崩溃(大多情况下要崩溃)!
因此,只要给name[3]分别赋给一个安全地址,程序就ok了,你的程序没有什么大问题,估计是漏定义一些变量!
那好办,补上就完事大吉了!
在char *name[3];的后面补!
char str[3][100]={0};//你懂的
然后是:
//printf("please enter three name:");//界面效果不好,不要了
for(i=0;i<3;i++)
{
  printf("please enter name[%d]:",(i+1));//在这里加了一句,
  name[i]=str[i];  //这个不用多说了吧,大家都知道的
  gets(name[i]);   //这就没问题了!
 }
现在程序是可以运行了,但别忘记
【6】注意:本函数可以无限读取,不会判断上限,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出!
所以我定义了个100,哈哈没谁的名字会有100个字符吧,不过也难讲!
希望对楼主能有帮助,哈哈!
如有不对之处,见谅见谅!娱乐一下吗!
2011-09-01 14:19
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
使用指针变量前,问一下自己,它指向何处,就不会犯这样的“狠”问题了。呵呵。

我们都在路上。。。。。
2011-09-01 14:37
椿尘楠子
Rank: 1
来 自:湖南
等 级:新手上路
帖 子:4
专家分:5
注 册:2011-8-26
收藏
得分:5 
用C写的,同意楼上的说法,“指针,先盖屋子,后住人”.
要先为止分配空间
希望下面的这个程序可以帮助你


#include"stdio.h"
#include"stdlib.h"

#define N 5
int main(void)
{
  int i;
  char *name[3];
  for(i=0;i<3;i++)
  {
      name[i]=(char*)malloc(N);
      gets(name[i]);
  }
      
  for(i=0;i<3;i++)
  printf("%s\n",name[i]);


    return 0;
}
2011-09-01 16:06
yegoudaozhan
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2011-9-1
收藏
得分:0 
我有一点点懂了
2011-09-01 16:15
笨女孩
Rank: 1
等 级:新手上路
帖 子:58
专家分:0
注 册:2011-7-13
收藏
得分:0 
回复 14楼 椿尘楠子
弱弱的问一下我学C一个学期了,malloc()库函数在书上只是点了一下,我完全不会用,您是在哪里学的呢?
求学malloc()!
2011-09-01 22:18
khaz
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:130
专家分:188
注 册:2011-4-21
收藏
得分:10 
没有给指针分配空间 可以用二维数组或者给指针动态分配内存
程序代码:
#include<stdio.h>
#include<string.h>
int main()
{
void sort(char (*a)[],int n); //a是行指针
int i;
char name[3][20];//用二维数组,这里用20个字节保存名字
printf("please enter three name:");
for(i=0;i<3;i++)
gets(name[i]);  
或:
#include<stdio.h>
#include<string.h>
int main()
{
void sort(char *a[],int n);
int i;
char *name[3];
printf("please enter three name:");
for(i=0;i<3;i++){
name[i]=malloc(sizeof(*name[i])*20);//*name[i]的类型是char
//或name[i]=malloc(sizeof(char)*20);
gets(name[i]);

}

[ 本帖最后由 khaz 于 2011-9-1 23:49 编辑 ]
2011-09-01 23:48
快速回复:狠简单的指针数组存储出错
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.059506 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved