为了账号安全,请及时绑定邮箱和手机立即绑定

字符串及文件操作问题?

字符串及文件操作问题?

C C++
慕粉18341035298 2017-01-10 17:25:10
#include<cstdio> #include<stdlib.h> #include<iostream> int main() {  char s[] = "asdfasdf";  FILE *d = fopen("a.txt", "r");  if (d == NULL){   printf("no\n");   exit(0);  }  char *m;//改成m[10]才可以,原来的写法为什么不对?  fgets(m,5, d);  printf("%s\n", m);  fclose(d); }
查看完整描述

3 回答

已采纳
?
onemoo

TA贡献883条经验 获得超454个赞

fgets 函数会把读到的字符串存入第一个参数所指的内存中。然而 char *m  这个 m 只是个 char 指针,且 m 没有被赋予初值,那么 m 的初值是不确定的——也就是说 m 指向一块不确定的内存,那一般不是你能合法、安全使用的内存。

fgets 的参数是指针,但它要操作的是指针所指的内存,所以注意不要仅仅传入一个指针,而是要确保指针所指的内存是你能合法使用的。


将 m 声明为 char m[10],这样 m 就是一个能容纳10个字符的数组。数组名在作右值使用时(传参时)会自动转为指向数组首元素的指针,所以你传入 fgets 的 m 就是一个指向 m 数组的指针。这样就可以让 fgets 正常工作了。

查看完整回答
1 反对 回复 2017-01-11
?
Xyino_Snake

TA贡献31条经验 获得超22个赞

这是一个中规中矩的C语言问题。我知道这是C++。char * 只是一个指针。你并不能直接往这个指针里写内容。除非它指向一块已经分配好的内存。比方说指向一个全局的char数组缓冲区。或者,你也可以用new来动态分配一块内存。可以写成char * m = new char[256];然后再传m给fgets就行了。当然,new []分配的内存必须用delete []手动释放掉。
查看完整回答
2 反对 回复 2017-01-11
  • 3 回答
  • 1 关注
  • 1559 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信