了解isdigit()如何在C中工作

时间:2013-03-05 18:07:21

标签: c string int

我正在尝试检查从文件读入的某些变量是否为整数,如果它们不是忽略它们并继续打印错误消息。所以我使用isdigit()来查看变量是否是整数,并且它在某种意义上继续“向后”工作。

int parseStudent(struct student *person, char *data){

char *ptr;
int temp;

int i = 0;

ptr = strtok(data, DELIM);

temp = atoi(ptr);

if(isdigit(temp)){printf("Invalid TERM integer!\n");}

//if(!isdigit(temp)){printf("Invalid TERM integer!\n");}


//person[i].term = temp;


ptr = strtok(NULL, DELIM);

person[i].id = atoi(ptr);


ptr = strtok(NULL, DELIM);

strcpy(person[i].lastname, ptr);


ptr = strtok(NULL, DELIM);

strcpy(person[i].firstname, ptr);


ptr = strtok(NULL, DELIM);

strcpy(person[i].subjectname, ptr);


ptr = strtok(NULL, DELIM);

person[i].catalog = atoi(ptr);


ptr = strtok(NULL, DELIM);

strcpy(person[i].section, ptr);

}

现在你可以看到我的第一次检查我的意图是看看第一个临时int(假设持有一个int,它确实是“1301”)实际上是一个整数。当我使用未注释的行时,它会使条件失败并且不会打印任何内容。当我使用注释行时,它会打印我的错误消息。不是倒退!?如何检查这些整数和字符串实际上是整数和字符串并在面上报告错误?

3 个答案:

答案 0 :(得分:3)

isdigit属于字符分类函数。因此,此函数会将atoi返回的值解释为字符(使用您的字符集,例如ASCII)。它不会是你所期望的。如果您想处理错误,可以阅读this answer

答案 1 :(得分:3)

isdigit - 检查文档 - 它应该用于字符变量,而不是整数值变量。

检查出来:

char digit = '1';
char notDigit = 'a';
char notEvenCloseADigit = 1;
int digitIsDigit = isdigit(digit);
int notDigitIsDigit = isdigit(notDigit);
int notEvenCloseADigitIsDigit= isdigit(notEvenCloseADigit);

答案 2 :(得分:0)

这不是倒退。如果是一个数字,isDigit返回true,你说你用了“1301”。所以你的未注释的行返回true。然而,后者需要真实或虚假。