使用 'E' 的 scanf 跳过我的整个循环一次
scanf with 'E' skip my whole loop once
抱歉,如果这个问题不好,但我无法解决这个问题
程序概念:它每行读取 1 个输入,直到出现 * 作为输入 N 表示北 S 表示南 NE 表示东北等...并在到达 *
后在 x、y 中找到您的位置
输入格式举例:8N表示向北移动8个单位
问题!!:当我将文本输入为 8N、8W、8S、8NE... 时,它工作正常并在我的循环中显示 "blablabla"。但是当我输入文本 1E,2E,3E No "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;
}
当您有这样的输入时:1E
,E
被消耗在尝试读取浮点数,例如 1E+00
。随后的 scanf("%s")
然后尝试将整个下一个输入读取为字符串,因此当您的输入是 1E 2E
时,tt
是 1.0 并且字符串是 2E
.
你可以找到这样的字符串 ba 打印出变量的值,而不是像 "blabla".
这样的占位符
也就是说:您的字符串 temp
很短。您最多可以合法输入两个字符,因为需要为终止空字符保留一个字符。您正在溢出缓冲区并可能损坏其他数据。
使您的 char 数组更大并提供最大缓冲区长度以防止溢出:
char temp[20];
scanf("%19s", temp); // Allow at most 19 chars
在上面的代码中,我只是传递了数组,而不是指向它的第二个元素的指针。您也应该这样做,并使所有数组索引从零开始,就像 C:
中的习惯一样
if (temp[0] == 'N' && temp[1] == 'E') ...
Edit:看起来 strtod
函数没有表现出与 scanf("%lf")
相同的行为,至少在我的(少数)实现中没有尝试过。这是尝试读取 float, string 形式的输入,其中两者不能用白色分隔 space:
#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
一次。
抱歉,如果这个问题不好,但我无法解决这个问题
程序概念:它每行读取 1 个输入,直到出现 * 作为输入 N 表示北 S 表示南 NE 表示东北等...并在到达 *
后在 x、y 中找到您的位置输入格式举例:8N表示向北移动8个单位
问题!!:当我将文本输入为 8N、8W、8S、8NE... 时,它工作正常并在我的循环中显示 "blablabla"。但是当我输入文本 1E,2E,3E No "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;
}
当您有这样的输入时:1E
,E
被消耗在尝试读取浮点数,例如 1E+00
。随后的 scanf("%s")
然后尝试将整个下一个输入读取为字符串,因此当您的输入是 1E 2E
时,tt
是 1.0 并且字符串是 2E
.
你可以找到这样的字符串 ba 打印出变量的值,而不是像 "blabla".
这样的占位符也就是说:您的字符串 temp
很短。您最多可以合法输入两个字符,因为需要为终止空字符保留一个字符。您正在溢出缓冲区并可能损坏其他数据。
使您的 char 数组更大并提供最大缓冲区长度以防止溢出:
char temp[20];
scanf("%19s", temp); // Allow at most 19 chars
在上面的代码中,我只是传递了数组,而不是指向它的第二个元素的指针。您也应该这样做,并使所有数组索引从零开始,就像 C:
中的习惯一样if (temp[0] == 'N' && temp[1] == 'E') ...
Edit:看起来 strtod
函数没有表现出与 scanf("%lf")
相同的行为,至少在我的(少数)实现中没有尝试过。这是尝试读取 float, string 形式的输入,其中两者不能用白色分隔 space:
#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
一次。