在C中扫描浮点数和整数作为字符串

时间:2013-06-12 15:02:54

标签: c scanf

#include <stdio.h>
#define MAX_SIZE 20

int main()
{
  int age;
  char name[MAX_SIZE];
  float wage;

  printf("input name, age and wage: ");

  scanf("%s %s %s", name, &age, &wage); //LINE 10
}
尝试编译后

lab4q5.c: In function 'main':
lab4q5.c:10: warning: format '%s' expects type 'char *', but argument 3 has type 'int*'
lab4q5.c:10: warning: format '%s' expects type 'char *', but argument 4 has type 'float *'
lab4q5.c:16: warning: control reaches end of non-void function

我是C编程的新手,想要扫描一个floatint,但是作为我的一个实验室的字符串。我知道我可以将%s %s更改为%f %d并且它应该编译正常,但我被要求扫描是否%s,任何帮助将不胜感激: 我遇到问题的部分问题如下:

  

使用循环读取输入(来自标准输入),每行一个输入,大约   名称年龄工资形式的用户信息,其中年龄为   整数字面值,而工资是浮点字面值,最多为2   十进制数。 •使用scanf(“%s%s%s”,姓名,年龄,工资)来读入   三个输入'字符串';

所以在阅读完评论后我决定将它们格式化为字符串,然后担心将它们作为int和float进行操作,这是我到目前为止所做的:

#include <stdio.h>
#define MAX_SIZE 20
#define MAX_AGE 3
int isXX(char name[])
{
if (name[0] == 'X' && name[1] == 'X' && name[2] == '\0')
return 0; //return return false to quit
else 
return 1; //return true 
}

int main()
{

char age[MAX_AGE];
char wage[MAX_SIZE];
char name[MAX_SIZE];

printf("input name, age and wage: ");//enter name as XX to quit
scanf("%s %s %s", name, age, wage);
    while(isXX(name[])) // //LINE 22
    {
        printf("input name, age and wage: ");//enter name as XX to quit 
        scanf("%s %s %s", name, age, wage);
    }
return 0;
}

现在我不知道为什么我在编译器中遇到这个错误但我

lab4q5.c: In function âmainâ:
lab4q5.c:22: error: expected expression before â]â token

3 个答案:

答案 0 :(得分:5)

使用atoiatof函数分别从字符串转换为intfloat。您可以先将agewage作为字符串阅读,然后使用这些函数将字符串转换为相应的类型,并将它们分配给相应的新变量。

顺便说一下,不要忘记包含stdlib.h以使其正常工作。

更正了您的代码版本:

#include<stdio.h>
#include<stdlib.h>
#define MAX_SIZE 20

int main()
{
char age[MAX_SIZE];
char name[MAX_SIZE];
char wage[MAX_SIZE];
int ageInteger;
float wageFloat;
printf("input name, age and wage: ");
scanf("%s %s %s", name, age, wage); //LINE 10

ageInteger=atoi(age);
wageFloat=atof(wage);
printf("Age:%d, Wage:%f\n",ageInteger,wageFloat);

return 0;
}

希望这会有所帮助......

修改

一条评论指出atoiatof在错误的情况下有未定义的行为,并建议使用stdtolstdtod代替atoi,{ {1}}。我自己也不知道这件事。所以,在使用它们之前要谨慎一点,并选择仔细选择你想做的研究。

答案 1 :(得分:3)

您正在将它们作为字符串读取并将它们分配给非字符串变量。

因此您需要更改代码:

 int age;
 char name[MAX_SIZE];
 float wage;

为:

 char age [3];
 char name[MAX_SIZE];
 char wage[MAX_SIZE];

scanf("%s %s %s", name, &age, &wage)

scanf("%s %d %f", name, &age, &wage)

根据您对问题的评论,我的问题是为什么您希望将它们作为字符串开头?

答案 2 :(得分:2)

您尝试读取字符串,但将值分配给非字符串。

尝试在scanf格式字符串中使用正确的类型:

scanf("%s %d %f", name &age &wage);

您可以查看scanf格式字符串的使用方式on wikipedia