scanf中的输入分区

scanf中的输入分区,c,C,我要接受字符串,并且“@”之间的浮点值存在。我试过一些像这样的东西,但不起作用;它将整个输入作为字符串 #include <stdio.h> #include <stdlib.h> int main() { char str[10000]; float number; scanf("%s@%f",str,&number); //input BMW@23.5 Expected output BMW 23.5 printf("%

我要接受字符串,并且“@”之间的浮点值存在。我试过一些像这样的东西,但不起作用;它将整个输入作为字符串

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

int main()
{
    char str[10000];
    float number;
    scanf("%s@%f",str,&number);    //input BMW@23.5 Expected output BMW 23.5
    printf("%s %f\n",str,number);  //actual output BMW@23.5 0.000000
}
#包括
#包括
int main()
{
char-str[10000];
浮点数;
scanf(“%s@%f”、str和number);//输入BMW@23.5预期输出BMW23.5
printf(“%s%f\n”,str,number);//实际输出BMW@23.50
}

有人能帮我解决这个问题吗?

char[]的形式获取所有内容并对其进行解析:

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

int main()
{
    char str[10000];
    float number;
    scanf("%s@%f",str,&number);    //input BMW@23.5 Expected output BMW 23.5
    printf("%s %f\n",str,number);  //actual output BMW@23.5 0.000000
}
int main()
{
    char str[10000];
    float number;

    scanf("%s", str);
    char *at_pos = strrchr(str, '@');
    if (at_pos)
    {
        number = atof(at_pos + 1);
        // manage errors in number
        printf("%s %f\n", str, number);
    }
    else
    {
        // manage error
    }
}
//使用“[^@]”确实可以节省您的时间。
//但是你可以用我的方法做很多事情。不仅仅是在那种情况下。
//可以忽略这一点,但如果您想检查并理解其中的逻辑,这里有我编写的代码。然后你可以改进它。Tnx。
#包括
内部主(空)
{
char-str[10000];
char c;//思想是,逐个收集输入。
浮动f;
浮动功率=10;
int counter=0;//我们需要这个字符串。
c=getchar();//获取第一个字符
str[counter]=c;//将其存储在第一个元素中
计数器++;
c=getchar();//因为我们知道输入是字符串,所以我们假定当然还有下一个字符。
而(c!=“@”)
{
//但是如果用户没有输入“@”字符呢?
//做这个!
如果(c==10)
{
printf(“我在那里找不到@=)\n\n”);
返回0;
}
str[counter++]=c;//如果
c=getchar();//它是否为@。如果不是,则存储它
}//并继续收集
//接下来的字符将每个字符存储在
//一次又一次地重复字符串,直到它到达“@”。从那里您可以停止。
//收集完所有字符后,开始收集数字。
c=getchar();//收集
f=c-“0”;//将字符转换为数字。我敢打赌您知道这一点。然后将其存储在浮点变量中。
c=getchar();//再次收集
//然后再次测试最近收集的数据,就像以前一样
虽然(c!=10&&c!='.')//10是该行或新行的ASCII码,对吗?//如果遇到'.'(点)。。
{
//如果不是10或点,则将其添加到浮点变量中。但不要忘记规则。使用10的幂表示。
f=f*10+(c-‘0’);
c=getchar();//再次收集。
}
//再做一次
c=getchar();
f+=(c-‘0’)/power;//现在用power除以它
c=getchar();
功率*=10;//然后增加功率。
//现在收集小数
而(c!=10)//就像以前一样
{
f+=(c-“0”)/power;//只需反复执行此操作即可
功率*=10;//重复一次,直到
c=getchar();//它达到ASCII 10。
}
//如果有,请测试它。=)
printf(“%s@%f”,str,f);
返回0;
}
//这是干净的代码。
#包括
内部主(空)
{
char-str[1000];
字符c;
浮动f;
浮动功率=10;
int计数器=0;
c=getchar();
str[counter]=c;
计数器++;
c=getchar();
而(c!=“@”)
{
//但是如果用户没有输入“@”字符呢?
//做这个!
如果(c==10)
{
printf(“我在那里找不到@=)\n\n”);
返回0;
}
str[counter++]=c;
c=getchar();
}
c=getchar();
f=c-‘0’;
c=getchar();
而(c!=10&&c!='.'))
{
f=f*10+(c-‘0’);
c=getchar();
}
c=getchar();
f+=(c-‘0’)/功率;
c=getchar();
功率*=10;
而(c!=10)
{
f+=(c-‘0’)/功率;
功率*=10;
c=getchar();
}
printf(“%s@%f”,str,f);
返回0;
}

谢谢@xing您为我节省了时间。如果我的输入是这样的话,那工作很好。如何处理BMW@12.34 AUDI@34.5.inbetween空格。@Rajkumar在依赖已分配的变量之前,还要检查
scanf()
的返回值。谢谢@unwind now's working。谢谢注意,要获得所需的输出,您需要在
printf
格式字符串-琐事中指定
%.1f