C 如何检查文本文件中的字符串是int、float还是none(字符串)?

C 如何检查文本文件中的字符串是int、float还是none(字符串)?,c,C,给定一个文本文件: 123.33 2 1242.1 99.9 2223.11 Hello 22 989.2 Bye 如何检查一行是整数还是浮点或(无)字符数组?如果是int,则将其放入intArray,如果是double/float,则将其放入doubleArray,否则将其放入charArray FILE *file = fopen(argv[1], "r"); char line[100]; int intArray

给定一个文本文件:

    123.33
    2
    1242.1
    99.9
    2223.11
    Hello
    22
    989.2
    Bye
如何检查一行是整数还是浮点或(无)字符数组?如果是int,则将其放入intArray,如果是double/float,则将其放入doubleArray,否则将其放入charArray

FILE *file = fopen(argv[1], "r");
char line[100];

int intArray[100];
double doubleArray[100];
char charArray[100];

while(fgets(line, sizeof(line), file) != NULL){


}

你可以这样做

FILE *file = fopen(argv[1], "r");
char line[100];

int intArray[100];
double doubleArray[100];
char charArray[100];

int intNum;
float floatNum;
int i = 0; //index for intArray
int j = 0; //index for floatArray

while(fgets(line, sizeof(line), file) != NULL){
   intNum = atoi(line); 
  if (num == 0 && line[0] != '0') { //it's not an integer
     floatNum = atof(line);
     if(/* to put test condition for float */) {  //test if it is a float
         //add to floatArray    
     } else {
        //or strcpy to charArray accordingly
     }
  } else { //it's an integer
     intArray[i++] = intNum; //add to int array
  }       
}

这里的问题是区分整数和浮点数。带有小数点或指数或两者的数字应视为浮点

用于数值转换的旧标准函数是用于整数的
atoi
,用于浮点数的
atof
。它们将解析字符串,但可能只解析了一半
atoi(“123.4”)
被解析为123。另一方面,
atof(118)
将(正确地)产生浮点数118.0

C99提供了更高级的解析函数
strtol
(用于长整数)和
strtod
(用于双精度)。这些函数可以返回一个尾部指针,指向未转换的第一个字符,这使您能够确定字符串是否被完全解析

有了它,我们可以编写一些简单的包装函数,告诉我们字符串是表示整数还是浮点数。确保首先测试整数,以便将
“23”
正确地视为整数:

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

int parse_double(const char *str, double *p)
{
    char *tail;

    *p = strtod(str, &tail);

    if (tail == str) return 0;
    while (isspace(*tail)) tail++;
    if (*tail != '\0') return 0;
    return 1;
}

int parse_long(const char *str, long *p)
{
    char *tail;

    *p = strtol(str, &tail, 0);

    if (tail == str) return 0;
    while (isspace(*tail)) tail++;
    if (*tail != '\0') return 0;
    return 1;
}

int main(void)
{
    char word[80];

    while (scanf("%79s", word) == 1) {
        double x;
        long l;

        if (parse_long(word, &l)) {
            printf("Integer %ld\n", l);
            continue;
        }

        if (parse_double(word, &x)) {
            printf("Double %g\n", x);
            continue;
        } 

        printf("String \"%s\"\n", word);
    }

    return 0;
}
#包括
#包括
#包括
int parse_double(const char*str,double*p)
{
字符*尾部;
*p=strtod(str和tail);
如果(tail==str)返回0;
而(isspace(*tail))tail++;
如果(*tail!='\0'),则返回0;
返回1;
}
int parse_long(const char*str,long*p)
{
字符*尾部;
*p=strtol(str和tail,0);
如果(tail==str)返回0;
而(isspace(*tail))tail++;
如果(*tail!='\0'),则返回0;
返回1;
}
内部主(空)
{
字符字[80];
而(scanf(“%79s”,word)==1){
双x;
长l;
if(解析长(单词和l)){
printf(“整数%ld\n”,l);
继续;
}
if(解析双精度(word和x)){
printf(“双%g\n”,x);
继续;
} 
printf(“字符串\%s\”\n,单词);
}
返回0;
}

查看标准功能
strtol
strtod
。而且很难将几个字符串放入一个
char
数组,该数组可以容纳字符,但不能容纳字符串,即以null结尾的字符段。浮点的测试条件是什么@WilliamKuit类似于整数测试,它是一个练习,您可以使用
atoi
识别整数的部分表示,因此
将“123donuts”
解析为123,跳过非整数部分。此外,
“9.234”
被解析为9,因此您在查找整数后查找double的想法是有缺陷的。仅供参考:C89有7.10.1.5 strtol函数