2015-05-14 1256 views
1

的n個字符我試圖寫一個小程序,以扭轉該文本的前n個字符的文件。我寫這篇::倒車文件

void getdata(FILE *fp) 
{ 
    char ch; 
    printf("Enter text::\n"); 
    while((ch=getchar())!=EOF) 
     fputc(ch,fp); 
} 

void printdata(FILE *fp) 
{ 
    char ch; 
    while((ch=fgetc(fp))!=EOF) 
     putchar(ch); 
} 

void reverse(FILE *fp, int n) 
{ 
    char ch[20]; 
    for(int i=0;i<n;++i) 
     ch[i]=fgetc(fp); 
    rewind(fp); 
    printf("%.*s\n",n,ch); //printing the string 
    while(n--) 
     fputc(ch[n-1],fp); 
} 

int main() 
{ 
    FILE *fp; 
    int n; 
    fp=fopen("music.txt","w+"); 
    getdata(fp); 
    rewind(fp); 
    printf("Number of chars to reverse:: "); 
    scanf("%d",&n); 
    reverse(fp,n); 
    rewind(fp); 
    printf("After reversing text is::\n"); 
    printdata(fp); 
    fclose(fp); 
    return 0; 
} 

,輸出是 enter image description here

我在哪裏去了?爲什麼會有'你'? 編輯:我能得到它與

for(int i=0;i<n;++i) 
     fputc(ch[n-1-i],fp); 

,但用while循環的工作是什麼的,而錯嗎?

+1

@ Javia1492呵?相反,你應該建議,因爲'EOF'可能不適合'char',請將'ch'類型改爲'int'。 –

+0

@Lokesh Jaddu而且,如果您沒有注意到,函數'reverse()'中的潛在緩衝區溢出。 – Downvoter

+0

@ Javia1492 1)哪一行你找到'eof()'?請爲我指出這一點。 2)'getchar()'的返回類型是什麼?而我並沒有想象任何事情。我很謙虛地告訴你,這很糟糕。希望你不介意。 :-) –

回答

1

你而故障原因是,第一循環遞減n。在你的使用情況n4而不是5開始。然後你在n-1分配字符,這意味着,n必須從5開始。最後你的循環是4時間長而不是5

變化

while(n--) 
     fputc(ch[n-1],fp); 

do 
{ 
    fputc(ch[n-1],fp); 
}while(--n); 

另一個鮮爲人知的事情。你的反向功能不檢查是n傳遞不能> CH的長度,你的情況20

+0

好的。 'while(n--)...'構造仍然是向後迭代的好習慣,但它必須訪問'ch [n]'而不是'ch [n-1]'。因此,沒有模糊索引的簡單解決方案就是'while(n--)fputc(ch [n],fp);'。 –

+0

是的,當然。你的解決方案更快我希望OP的解決方案更加清晰。 – LPs

+0

你的回答很好。這更多的是一個額外的評論。 (也許只是爲了我自己,因爲我曾經看過代碼並沒有看到錯誤,這就是idoims的問題:它們可能會導致你忽視這個明顯的問題。) –

0
for(int i=0;i<n;++i) //consider n as 5 
    fputc(ch[n-1-i],fp);// ch[5-1-0] ch[5-1-1] ch[5-1-2] ... 

當控制到達fputc(ch[n-1],fp) n具有已經遞減不等同於

while(n--)    //consider n as 5 
    fputc(ch[n-1],fp); //ch[4-1] ch[3-1] .... 

在while循環while(n--)後。