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

标签 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;
}

最佳答案

当您输入这样的内容时:1EE 会在尝试读取 float 时被消耗,例如 1E+00 。随后的 scanf("%s") 然后尝试将整个下一个输入读取为字符串,因此当您的输入是 1E 2E 时,tt是 1.0,字符串是 2E

您可以找到这样的字符串 ba 打印出变量的值,而不仅仅是像“blabla”这样的占位符。

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

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

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 .

关于c - scanf with 'E' 跳过我的整个循环一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27998088/

相关文章:

c - sscanf的返回值

c - scanf() 是如何工作的?

c - 如何从控制台读取未知数量的整数?

c - 如何在c中中断Scanf(),从scanf退出

java - 构建快速 Android 应用程序 - Java 还是 native ?

C:动态分配时通过引用传递

c - GCC 中的内联汇编,通过表达式指定偏移量

c - 段错误: Stack allocation in a C program in Ubuntu when bufffer>4M

C、从一次 scanf 中读取多个数字

c - 从已卸载模块的 pdb 中提取结构信息