user-0 提问: 写是写进去文件了，可为什么读不出来，请问哪里错了，难道是指针那里的问题？

回复:
user: user-1
content: #include "stdio.h"   int main() {     FILE *fp;     int flag = 0;     char a[30];     char *p, ch;      gets(a);     if((fp=fopen("bbs.txt","w"))==NULL)     {         printf("第一次打不开文件");         return -1;    //stop processing.     }     fprintf(fp,"%s",a);      fclose(fp);//注意关闭文件再二次打开！      if((fp=fopen("bbs.txt","r"))==NULL)     {         printf("第二次打不开文件 ");         return -1;    //stop processing.     }     rewind(fp);    //redundant code.     p = a;     fscanf(fp,"%s", p);      while (*p) {         if (*p == 'b') {             if (*(p + 1) != 0 && *(p + 1) == 'y') {                 if (*(p + 2) != 0 && *(p + 2) == 'e') {                     break;                 }             }         }         printf("%c", *p);         p++;     }     /*     while(fscanf(fp,"%c", p)==1)     {         if(*p == 'b') {             flag = (flag << 1) + 1;         }         if (*p == 'y' && flag == 1)             flag = (flag << 1) + 1;         else             flag = 0;         if (*p == 'e' && flag == 3)             break;         else             flag = 0;          printf("%c",*p);     }     */     printf("bye\n");     fclose(fp); } 供参考~

user: user-1
content: 引用 7 楼 chwj888 的回复:[quote=引用 4 楼 自信男孩的回复:]#include "stdio.h"   int main() {     FILE *fp;     int flag = 0;     char a[30];     char *p, ch;      gets(a);     if((fp=fopen("bbs.txt","w"))==NULL)     {         printf("第一次打不开文件");         return -1;    //stop processing.     }     fprintf(fp,"%s",a);      fclose(fp);//注意关闭文件再二次打开！      if((fp=fopen("bbs.txt","r"))==NULL)     {         printf("第二次打不开文件 ");         return -1;    //stop processing.     }     rewind(fp);    //redundant code.     p = a;     fscanf(fp,"%s", p);      while (*p) {         if (*p == 'b') {             if (*(p + 1) != 0 && *(p + 1) == 'y') {                 if (*(p + 2) != 0 && *(p + 2) == 'e') {                     break;                 }             }         }         printf("%c", *p);         p++;     }     /*     while(fscanf(fp,"%c", p)==1)     {         if(*p == 'b') {             flag = (flag << 1) + 1;         }         if (*p == 'y' && flag == 1)             flag = (flag << 1) + 1;         else             flag = 0;         if (*p == 'e' && flag == 3)             break;         else             flag = 0;          printf("%c",*p);     }     */     printf("bye\n");     fclose(fp); } 供参考~ 四楼大哥 我试了一下你的  p那里本来是%s 后来是%c 有点奇怪 运行不了[/quote] 给你的代码我是测试过的.是复制一下我的代码然后测试一下

user: user-0
content: 引用 4 楼 自信男孩的回复:#include "stdio.h"   int main() {     FILE *fp;     int flag = 0;     char a[30];     char *p, ch;      gets(a);     if((fp=fopen("bbs.txt","w"))==NULL)     {         printf("第一次打不开文件");         return -1;    //stop processing.     }     fprintf(fp,"%s",a);      fclose(fp);//注意关闭文件再二次打开！      if((fp=fopen("bbs.txt","r"))==NULL)     {         printf("第二次打不开文件 ");         return -1;    //stop processing.     }     rewind(fp);    //redundant code.     p = a;     fscanf(fp,"%s", p);      while (*p) {         if (*p == 'b') {             if (*(p + 1) != 0 && *(p + 1) == 'y') {                 if (*(p + 2) != 0 && *(p + 2) == 'e') {                     break;                 }             }         }         printf("%c", *p);         p++;     }     /*     while(fscanf(fp,"%c", p)==1)     {         if(*p == 'b') {             flag = (flag << 1) + 1;         }         if (*p == 'y' && flag == 1)             flag = (flag << 1) + 1;         else             flag = 0;         if (*p == 'e' && flag == 3)             break;         else             flag = 0;          printf("%c",*p);     }     */     printf("bye\n");     fclose(fp); } 供参考~ 四楼大哥 我试了一下你的  p那里本来是%s 后来是%c 有点奇怪😳 运行不了

user: user-0
content: 谢谢😜你这个是不用指针的感觉好理解点 一用指针我就感觉复杂了 可是这题就是要求用指针 我哭了

user: user-0
content: 呃呃 我试了下 如果用strstr判断一个字符串含有bye  判断出来后怎么输出bye前面的字母？用%c不行

user: user-2
content: 首先，如楼上说的，*p没有初始化就使用，即fscanf(fp, “%c”, p)这里还没有给p分配内存。 其次，每次只读一个字符，当前字符保存在p地址，p+1地址是没有保存过信息，所以 *(p+1)==‘y' 这样的判断是无意义的。 所以，要么像LS说的，用字符串的方式读入信息，要么，如果还想以一个字符一个字符读入，就要自己控制。 比如 char p; //这里修改为字符类型而不是指针 int count = 0; //用个计数器判断连续的字符 while (fscanf(fp, “%c”, &p) == 1)  {     if (p==‘b’ && !count) //如果当前读入字符是b且计数器是0         a[count++] = p;//则把字符保存到数组     else if (p==‘y’ && count==1) //如果当前读入字符是y且计数器是1         a[count++]=p;//则把字符保存到数组     else if (p==‘e’ && count==2)     {//如果当前读入字符是e且计数器是2         a[count++]=p;          break; //说明连续3个字符刚好是bye，退出循环     }     else      {//如果非上述情况         if (count)         {//如果计数器大于0，说明有未打印字符             for (int i=0; i<count; i++)                 printf(“%c”, a[i]);//则先打印保存在数组的字符             count = 0;//计数器清0         }         printf(“%c”, p);//再打印当前字符     } } printf(“bye”);

user: user-3
content: 前面这么写是一次读入一个字符串 如果bye是在一个字符串的尾巴就要换一种方法来检测bye是否存在 用str（a，“bye”）是否是NULL来判断读取的字符串当中是否包含bye这个字符串

user: user-3
content: char *p;  没有赋值就使用，这个属于野指针啊     if((fp=fopen("bbs.txt","r"))==NULL)         {                 printf("第二次打不开文件 ");         }         rewind(fp); // 这句没有用 p = a;. // 把内容读到a数组里面， 这个数组是有自己空间的。          while(fscanf(fp,"%s",p)==1) // %c是只读一个字符， 字符串要%s读取         {                 if(*p=='b')                         if(*(p+1)=='y')                                 if(*(p+2)=='e')                                         break;                  printf("%s",p);         }         printf("bye");