簡體   English   中英

在C中以字符串形式掃描浮點數和整數

[英]Scanning floats and ints as a string in C

#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但將其作為String進行我的實驗室之一。 我知道我可以將%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

使用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代替atoiatof 我本人對此一無所知。 因此,在使用它們之前要格外謹慎,並通過一些研究仔細選擇了您想要做的事情。

您正在將它們讀取為字符串並將其分配給非字符串變量。

因此,您需要更改以下代碼:

 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)

根據對您的問題的評論,我的問題是,為什么要以字符串開頭?

您正在嘗試讀取字符串,但將值分配給非字符串。

嘗試在scanf格式字符串中使用正確的類型:

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

您可以看看Wikipedia如何使用scanf格式字符串

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM