C语言请问char *s:gets(s):puts(s);

cs_uestc 2018-12-04 12:01:11
输出不了,还有像strcpy.strcmp.strcat,fges函数也不能这么用,我现在就很迷字符指针变量和字符数组有什么区别,为什么字符数组就可以了呢?请帮忙解答一下,万分感谢你。
...全文
409 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
神童i 2018-12-06
  • 打赏
  • 举报
回复
字符数组能存是因为人家有内存空间,指针变量有吗?当然有,但是这个空间是来存它指向空间地址的,gets(s)函数不是把输入的字符串存到s变量里, 而是存到s指向的空间里,你的代码明显没有让s指向一块有效的空间,所以输入的东西存到哪呢?
自信男孩 2018-12-05
  • 打赏
  • 举报
回复
char *s;这里的s是指针变量,并且是一个野指针,所谓野指针,即指针变量里存放的地址是一个随机数,若这个地址值是指向不可读写的位置,那么gets(s)或fgets(s,xx, xx);就会出现段错误;

而用char s[16], gets(s), fgets(s, 16, xx);就没问题,是因为数组的长度16是有效内存空间,可以读写。

char *s = malloc(sizeof(char) * 16); 这样可以把s看成s[16]了,但是注意malloc是在堆上申请空间,需要手动释放free(s);
henysugar 2018-12-04
  • 打赏
  • 举报
回复
最好能贴一下你的代码进一步诊断。 字符指针和字符数组某些情况下可以认为是一样的。 例如: char sarray[128] = {'1','2','3','4',0}; const char *s = "1234"; printf("%s",s); printf("%s",sarray); 这种情况下s和sarray可以认为是一样的变量,它们代表的都仅仅是一个指针。 以上两个printf都能打印出“1234”; 你提到的s不可以,而数组可以,我猜测可能是你的s没有开辟内存空间,而数组是系统自动帮你开辟了的。 所以,你最好是这样写: char *s = (char *)malloc(1024); 然后再使用gets等函数。
@风轻云淡_ 2018-12-04
  • 打赏
  • 举报
回复
指针需要分配内存才能使用. char* s = new char[64];
lin5161678 2018-12-04
  • 打赏
  • 举报
回复
str野指针 不能作为gets 和 puts的参数
顺便gets这个函数已经被废弃 别再用了
英雄@末路 2018-12-04
  • 打赏
  • 举报
回复
确定下你的字符指针初始化了没
「已注销」 2018-12-04
  • 打赏
  • 举报
回复
不管是指针,还是数组,指针必须指向有效的且可写的内存空间。
char *s; // 没初始化,所以地址是随机的,野指针!
gets(s); // 错误!指针指向的随机区域不一定属于你的进程空间,就算是也不一定可写。
puts(s); // 不算错误,也不正确!读取可能不属于自己进程空间的内容数据,大多情况是乱码!
// 严格来讲,这样写是不正确的,应该是 const char *s 才对:
char *s = "abc"; // 初始化,指向常量区的 "abc" 字符串;
gets(s); // 错误!指针指向的的是常量区,属于你的进程空间,但是只读不可写。
puts(s); // 正确!输出字符串!
char buffer[128] = { 0 }; // 初始化 128 个字节为空;
char *s = buffer; // 初始化,指向 buffer 可以读写。
gets(s); // 正确!也可以直接用 buffer 传参。数组名传递到参数则退化为指针,即和 char *s 相同意义。
puts(s); // 正确!也可以直接用 buffer 传参。数组名传递到参数则退化为指针,即和 char *s 相同意义。
char *s = calloc(128, sizeof(char)); // 初始化 s 为新申请的 128 字节内存空间。
gets(s); // 正确!
puts(s); // 正确!
free(s);

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧