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函数