由鍵盤輸入任意個字符(以連著的三個小寫字符bye做為結束標志),將所有字符(包括bye),寫入新建的檔案bbs.txt中(注:檔案放在當前目錄)。再從該檔案讀取之前寫入的內容,遇到 "bye" 就停止輸出。
#include "stdio.h"
int main()
{
FILE *fp;
char a[30];
char *p;
gets(a);
if((fp=fopen("bbs.txt","w"))==NULL)
{
printf("第一次打不開檔案");
}
fprintf(fp,"%s",a);
fclose(fp);//注意關閉檔案再二次打開!
if((fp=fopen("bbs.txt","r"))==NULL)
{
printf("第二次打不開檔案 ");
}
rewind(fp);
while(fscanf(fp,"%c",p)==1)
{
if(*p=='b')
if(*(p+1)=='y')
if(*(p+2)=='e')
break;
printf("%c",*p);
}
printf("bye");
fclose(fp);
}
uj5u.com熱心網友回復:
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");
uj5u.com熱心網友回復:
前面這么寫是一次讀入一個字串如果bye是在一個字串的尾巴就要換一種方法來檢測bye是否存在
用str(a,“bye”)是否是NULL來判斷讀取的字串當中是否包含bye這個字串
uj5u.com熱心網友回復:
首先,如樓上說的,*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”);
uj5u.com熱心網友回復:
#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);
}
供參考~
uj5u.com熱心網友回復:
呃呃 我試了下
如果用strstr判斷一個字串含有bye 判斷出來后怎么輸出bye前面的字母?用%c不行
uj5u.com熱心網友回復:
謝謝??你這個是不用指標的感覺好理解點 一用指標我就感覺復雜了 可是這題就是要求用指標 我哭了uj5u.com熱心網友回復:
四樓大哥 我試了一下你的 p那里本來是%s 后來是%c 有點奇怪?? 運行不了
uj5u.com熱心網友回復:
給你的代碼我是測驗過的.是復制一下我的代碼然后測驗一下
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/140675.html
標籤:C語言
上一篇:c++問題
下一篇:救急救急
