C 从文本文件获取演示的像素值

C 从文本文件获取演示的像素值,c,visual-studio-2010,C,Visual Studio 2010,我编写了一个程序,从文本文件中读取值,并将其作为像素值进行演示。我的任务是扫描像素位置的值,如果该值为行值大于2或列值大于1,它将打印“无效像素位置\n”,然后”退出,按\“q”\或要继续下一个位置,请按\“c\”。在此之后,它将扫描输入。现在的问题是,如果我输入了无效的值,例如3,5,它会打印printf()语句两次,然后在scanf()函数中出现。 这是我的密码:- #include"stdio.h" #include"stdafx.h" #include"conio.h" in

我编写了一个程序,从文本文件中读取值,并将其作为像素值进行演示。我的任务是扫描像素位置的值,如果该值为行值大于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();
}
#包括“stdio.h”
#包括“stdafx.h”
#包括“conio.h”
int r,c,check;
int main()
{
文件*p;
字符l[3],m[3],n[3],i,j,k,a;
p=fopen(“s.txt”、“r+”);
转到选项卡;
//int r,c,check;
选项卡:
{
而(1)
{
fseek(p,0,SEEK_集);
printf(“输入位置\n”);
scanf(“%d\n%d”、&r和&c);
而((r>2)|(c>1))
{
printf(“无效像素位置\n”);
printf(“要退出按\“q\”或继续下一个位置,请按\“c\”:-\n”);
scanf(“%c”和“检查”);
如果(检查=='c')
{
转到选项卡;
}
否则如果(检查=='q')
{
返回0;
}
}
printf(“您要求像素%c%c-”;printf(“%2d%2d\n”,r,c);

对于(k=0;k您在使用
scanf
时有一个非常常见的错误,即它将换行保留在输入缓冲区中,扫描字符将读取包括换行符在内的所有字符

这两条有问题的线是:

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

...

scanf("%c",&check);
如上所述,第一个
scanf
函数将最后一个换行保留在输入缓冲区中,以便第二个
scanf
读取。通过在第二个
scanf
格式代码中添加前导空格,指示该函数跳过前导空格,可以非常简单地解决此问题:

scanf(" %c",&check);

摆脱goto语句,重构代码……并正确格式化代码。