2014-05-19 20 views
0

我編寫了一個程序來讀取文本文件中的值,並將它們作爲demo的像素值處理。我的任務是掃描像素位置的值,如果值爲行值更大比2或列值大於1,則會打印「無效像素位置\ n」,然後「退出按\」q \「或繼續下一個位置按\」c \「。 。將掃描輸入現在的問題是,如果我輸入無效的值,例如3,5它打印的printf()語句兩個時間,然後在這裏談到的scanf()的函數 是我的代碼: -從文本文件中獲取演示的像素值

#include"stdio.h" 
#include"stdafx.h" 
#include"conio.h" 

    int r,c,check; 
int main() 
{ 
    FILE *p; 
    char l[3],m[3],n[3],i,j,k,a; 

    p=fopen("s.txt","r+"); 
    goto tab; 
// int r,c,check; 
tab: 
    { 

    while(1) 
    { 
    fseek(p,0,SEEK_SET); 
    printf("enter the position\n"); 
    scanf("%d\n%d",&r,&c); 

    while((r>2)|(c>1)) 
    { 
     printf("invalid pixel position\n"); 

     printf("to exit press \"q\" or to continue for next position press \"c\":-\n"); 

     scanf("%c",&check); 
     if(check=='c') 
     { 
     goto tab; 
     } 
     else if(check=='q') 
     { 
     return 0; 
     } 

    } 




    printf("you ask for pixel %c %c- ");printf("%2d%2d\n",r,c); 
    for(k=0;k<=r;k++) 
    { 
    for(i=0;i<=c;i++) 
    { 
     for(j=0;j<3;j++) 
     { 
      fread(&l[j],sizeof(a),1,p); 
      fread(&m[j],sizeof(a),1,p); 
      fread(&n[j],sizeof(a),1,p); 
      fread(&a,sizeof(a),1,p); 
     } 

    } 
    } 

    for(i=0;i<3;i++) 
    { 
     if(i==0) 
     { 
      printf(" red= %c%c%c",l[i],m[i],n[i]); 
     } 
     if(i==1) 
     { 
      printf(" green= %c%c%c",l[i],m[i],n[i]); 
     } 
     if(i==2) 
     { 
      printf(" blue= %c%c%c\n",l[i],m[i],n[i]); 
     } 
    } 
    } 
    } 
    fclose(p); 
     getch(); 
} 
+1

擺脫goto語句和重構代碼。 – this

+0

...並正確格式化您的代碼。 –

回答

2

您在使用scanf時出現了一個非常常見的錯誤,即它將新行保留在輸入緩衝區中,並且掃描字符時會讀取全部個字符,包括換行符。

兩個問題的線路是這些:

scanf("%d\n%d",&r,&c); 

... 

scanf("%c",&check); 

第一scanf功能,正如我上面所說的,離開在輸入緩衝器中的最後一個換行用於第二scanf閱讀。這是非常簡單的修復,在其指示功能,跳過前導空白第二scanf格式代碼添加一個空格:

scanf(" %c",&check);