gpt4 book ai didi

c - 在 for 循环中扫描用户输入

转载 作者:行者123 更新时间:2023-11-30 17:41:13 24 4
gpt4 key购买 nike

我正在尝试在 for 循环中扫描用户输入,除了循环的第一次迭代之外,需要 2 条数据才能继续下一步,我不明白为什么。我将在下面展示我的代码,但作为提示,我对此真的很陌生,而且不是很好,我什至不确定我使用的方法是否是最有效的。

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

#define w 1.0
#define R 1.0

int main(int argc, char *argv[])
{
int tmp;
double *x, *v, *m, *k;

x = malloc((argc-1)*sizeof(double));
v = malloc((argc-1)*sizeof(double));
m = malloc((argc-1)*sizeof(double));
k = malloc((argc-1)*sizeof(double));

if(x != NULL)
{
for(tmp=0; tmp<argc-1; tmp++)
{
sscanf(argv[tmp+1], "%lf", &x[tmp]);
}
}
else
{
printf("**************************\n");
printf("**Error allocating array**\n");
printf("**************************\n");
}

if(argc <= 2)
{
printf("************************************\n");
printf("**There must be at least 2 masses!**\n");
printf("************************************\n");
}
else if(argc == 3)
{
for(tmp=0; tmp<argc-1; tmp++)
{
printf("Input a value for the velocity of Block %d\n", tmp+1);
scanf("%lf\n", &v[tmp]);
}

for(tmp=0; tmp<argc-1; tmp++)
{
printf("Input a value for the mass of Block %d\n", tmp+1);
scanf("%lf\n", &m[tmp]);
}

for(tmp=0; tmp<argc-1; tmp++)
{
printf("Input a value for the spring constant of Spring %d\n", tmp+1);
scanf("%lf\n", &k[tmp]);
}
}
else
{
for(tmp=0; tmp<argc-1; tmp++)
{
printf("Input a value for the velocity of Mass %d\n", tmp+1);
scanf("%lf\n", &v[tmp]);
}

printf("Input a value for the mass of each Block\n");
for(tmp=0; tmp<argc-1; tmp++)
{
scanf("%lf\n", &m[tmp]);
}

printf("Input a value for the spring constant of each Spring\n");
for(tmp=0; tmp<argc-1; tmp++)
{
scanf("%lf\n", &k[tmp]);
printf("%lf\n", &k[tmp]);
}
}
}

所以,是的,主要问题是当获取 block 1 的速度值时,它需要两个值

最佳答案

删除空格"\n"在每种格式之后。

// scanf("%lf\n", &v[tmp]);
scanf("%lf", &v[tmp]);
<小时/>

空白"\n"之后"%lf"指挥scanf()继续扫描并消耗空白(例如 ' ''\n''\t''\r' 以及通常的其他 4 个),直到非空白 char被发现。这将消耗 Enter'\n' 寻找更多的空白。

stdin通常是缓冲的,需要在 scanf("\n") 之前输入整个下一行。看到其中任何一个。

一次scanf("\n")遇到非空白,它会将其放回 stdin用于下一个 I/O 操作。

<小时/>

scanf()一般来说,当输入错误的输入时,就会带来挑战。为了稳健地处理邪恶的用户输入,请考虑 fgets()/sscanf()组合。 (或fgets()/strtod())

char buf[50];
double d;
if (fgets(buf, sizeof buf, stdin) == NULL) Handle_EOForIOError();
if (sscanf(buf, "%d", &d) != 1) Handle_ParseError();
// good to go

以下内容确实消耗了 double 之后的字符,通常是 Enter,但如果出现“1.23.45”等输入,则会产生错误处理挑战。

// scanf("%lf\n", &m[tmp]);
scanf("%lf%*c", &m[tmp]); // Not recommended.

无论采用什么代码路径,检查scanf()/sscanf()/fcanf()的结果总是一个好主意。 ,尤其是在阅读 double 时.

<小时/>

空白指令 " " , "\n" , "\t"等都表现相同。格式字符串中的任何空白指令都会消耗所有空白。

// All work the same.    
scanf("%lf\n", &v[tmp]);
scanf("%lf\t", &v[tmp]);
scanf("%lf ", &v[tmp]);

关于c - 在 for 循环中扫描用户输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21204925/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com