scanf with' E'跳过我的整个循环一次

时间:2015-01-17 09:29:44

标签: c scanf

抱歉如果这个问题不好,但我无法弄明白

程序概念:每行读取1个输入,直到*作为输入N表示北方S表示南方NE表示东北等...并在到达*后找到x,y中的位置

输入格式示例:8N表示向北移动8个单位

问题!!:当我输入文本为8N,8W,8S,8NE ....它工作正常并在我的循环中显示“blablabla”。但是当我输入文本为1E,2E,3E时没有“blablabla”存在且我的x没有增加或减少。这是因为scanf?

感谢您的帮助

#include <stdio.h>
int main()
{
    char temp[3];
    double x=0,y=0,tt;
    while(temp[1]!='*')
    {
        temp[2]=0;
        temp[1]='E';
        scanf("%lf",&tt);
        scanf("%s",&temp[1]);
        printf("blablabla");
        if(temp[1]=='E'&&temp[2]==0)
        {
            x+=tt;
        }
        if(temp[1]=='N'&&temp[2]==0)
        {
            y+=tt;
        }
        if(temp[1]=='W'&&temp[2]==0)
        {
            x-=tt;
        }
        if(temp[1]=='S'&&temp[2]==0)
        {
            y-=tt;
        }
        tt/=1.41421356237;
        if(temp[1]=='N'&&temp[2]=='E')
        {   
            x+=tt;
            y+=tt;
        }
        if(temp[1]=='N'&&temp[2]=='W')
        {
            x-=tt;
            y+=tt;
        }
        if(temp[1]=='S'&&temp[2]=='E')
        {
            x+=tt;
            y-=tt;
        }
        if(temp[1]=='S'&&temp[2]=='W')
        {
            x-=tt;
            y-=tt;
        }
    }
    printf("%.3lf %.3lf\n",x,y);
    return 0;
}

1 个答案:

答案 0 :(得分:2)

如果输入如下:1E,则在尝试读取浮点数时会消耗E,例如1E+00。然后,scanf("%s")会尝试将整个下一个输入读取为字符串,因此当您的输入为1E 2E时,tt为1.0且字符串为2E

你可以找出这样的字符串ba打印出变量的值,而不仅仅是像#34; blabla&#34;这样的占位符。

那说:你的字符串temp非常短。您可以合法地输入最多两个字符,因为需要为终止空字符保留一个字符。您正在溢出缓冲区并可能损坏其他数据。

使您的char数组更大并提供最大缓冲区长度以防止溢出:

char temp[20];

scanf("%19s", temp);      // Allow at most 19 chars

在上面的代码中,我刚刚传递了数组,而不是指向第二个元素的指针。您也应该这样做,并使所有数组索引从零开始,如C:中所习惯的那样

if (temp[0] == 'N' && temp[1] == 'E') ...

修改strtod函数似乎没有显示与scanf("%lf")相同的行为,至少在我尝试的(少数)实现中没有显示。这里尝试读取float,string形式的输入,其中两者不能用空格分隔:

#include <stdlib.h>
#include <stdio.h>

int main()
{
    char buf[40];

    while(scanf("%39s", buf) == 1 && *buf != '*')
    {
        double dist;
        char *dir;

        dist = strtod(buf, &dir);

        if (dist == 0 && dir == buf) {
            printf("Invalid input\n");
            continue;
        }

        printf("%g '%s'\n", dist, dir);
    }

    return 0;
}

这似乎有效。如果strtod超过了E,尽管实现中缺少指数,您仍然可以在此解决方案中追溯dir一个用于临时字符串的方法。