猿问

字符串及文件操作问题?

#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);
}


慕粉18341035298
浏览 1560回答 3
3回答

onemoo

fgets 函数会把读到的字符串存入第一个参数所指的内存中。然而 char *m  这个 m 只是个 char 指针,且 m 没有被赋予初值,那么 m 的初值是不确定的——也就是说 m 指向一块不确定的内存,那一般不是你能合法、安全使用的内存。fgets 的参数是指针,但它要操作的是指针所指的内存,所以注意不要仅仅传入一个指针,而是要确保指针所指的内存是你能合法使用的。将 m 声明为 char m[10],这样 m 就是一个能容纳10个字符的数组。数组名在作右值使用时(传参时)会自动转为指向数组首元素的指针,所以你传入 fgets 的 m 就是一个指向 m 数组的指针。这样就可以让 fgets 正常工作了。

Xyino_Snake

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

慕的地8582982

WCLLLOLYBBCEAWMCVRZQDGBXKTHEYOUJJFBEYMGQJPMDXDPGMFOZAHHRNIFIENQFPFFHDMJYHJRBYSBEIFAQACYVNCLCTUSIXBXVLTXMXNWSCSCGIYURAJYCYBXSVSBZOKNDNWYOKUDFILVQLCMCFBRHRBKMCFMQNRAKNOEZCMIROKFPUCTWFQADSNWPRFBSVEUDGQCFITOSHDTDGGPZPRBRNCSOGWGQGUXNCTWOKUQNDEHQTCEGIMPEPZPMIEGPMWGVSIYOFHWGDNDMIGCJRHEJEIKUQTACSPFIYBDGDOQTKAEADFCLBRHQMJTQZURSADHRAQHQTKAWSWTKTDGPZHQMCTIGJLVYXNWFUSHRTJAYOEIYVLBQMUQGDLVEHQMIYCYPSIRURNXORMDZQTWZHEVVXUQHXIRTDNXAJZBYVZVYIRAPTRGPMUYHBQZKADMHWZPBXAQTDFOKMVBWZWYBRHQZCKZQSIFVMISVQFBFWRZWMVYIQAJGWGVRBLDMWNXZBFBLBEUEHXUENJZVAQFJGXAHNANDYVYBEHDGVFMQZPSAXHWGDUILHECZPLHELISOYHJGJFBHYHKAKFCYADQSUXTLNDTCSHJRCYIYVKAFWSHXAJFOEBYOWAKUXBLBXHYSOYUKGJYCSSADNKUDUCFIOQHLHLHXZPSUJLWRBKHWFWRTEHQMDFGQMIXZKNJAXMPMDLIESUEUEGJYBDLAQGVRBFKTVRBQGPGCFVQTQTVRZPYBQFCYOCROKAQJRMXMCLOJTQZCEOKARTWXUVXAILHDGVZWQUPZIYORNQYTXMCYILNCLBDMVLNFOQZOEGJFOYOEVKOPEMPGCFCEURNKTFYLLPCLNSQKGJSPFOKALPJYJYCFDFIY
随时随地看视频慕课网APP
我要回答