我试图确定字符串是否包含某个符号,特别是句点。我用这个来确定一个数字是实数还是整数。第一个条件是字符串必须包含0到9之间的数字才能被视为数字,如果它具有句点(十进制),则它将被视为实数。如果没有句号,那么它是一个整数。我无法预先知道我做错了什么!
void typenumber(char *str)
{
int i=0;
if(str[i]>='0' && str[i]<='9')
{
if(str[i]=='.')
{
printf("String %s is a real number.\n", str);
}
else
{
printf("String %s is an integer.\n", str);
}
}
return;
}
答案 0 :(得分:3)
我正在尝试确定字符串是否包含某个符号,特别是句点。
您可以使用strchr()
进行检查,如下所示:
if (strchr(str, '.') != NULL) {
printf("String %s is a real number.\n", str);
}
else {
printf("String %s is an integer.\n", str);
}
但是您的输入字符串可能包含多个'.'
字符或除数字和句点字符以外的字符。因此,最好循环输入字符串的每个字符并检查它,如下所示:
#define INT_NUM 1
#define REAL_NUM 2
int typenumber(char *str) {
int num_type = INT_NUM;
if ((str == NULL) || (*str == '\0')) {
printf ("Invalid input\n");
return 0;
}
while (*str != '\0') {
if (!isdigit(*str)) {
if ((*str == '.') && (num_type == INT_NUM)) {
num_type = REAL_NUM;
} else {
return -1;
}
}
str++;
}
return num_type;
}
答案 1 :(得分:2)
您似乎手动推出了strtol()
的实现,它将有效地将字符串转换为long。
如果您真的必须亲自检查字符串元素,那么使用isdigit()
将是一个好主意。
答案 2 :(得分:0)
没有循环!
i
将始终为0,因此您只需检查第一个字符或str
。
答案 3 :(得分:0)
这里的问题是你没有旅行
int typeNumber(char *str)
{
if(isNumericDecimal(str))
{
if (strchr(str, '.') != NULL) return 1; //Prime, string contain dot
else return 0; //Integer, string does not contains dot
}
else return - 1; //Letter or simbol
}
int isNumericDecimal (const char * s)
{
if (s == NULL || *s == '\0' || isspace(*s))
return 0;
char * p;
strtod (s, &p);
return *p == '\0';
}
void typenumber(char *str)
{
if(typeNumber(str) == 1)
{
printf("String %s is a real number.\n", str);
}
if(typeNumber(str) == -1)
{
printf("String %s is not a numeric value", str);
}
if(typeNumber(str) == 0)
{
printf("String %s is an integer.\n", str);
}
return;
}
答案 4 :(得分:0)
以下是错误的,因为如果str[i]>='0' && str[i]<='9'
为真,那么str[i]
必须是数字,因此永远不会是'.'
if(str[i]>='0' && str[i]<='9') {
if(str[i]=='.')
我正在使用它来确定数字是实数还是整数。
这似乎是真正的问题,而不是“试图确定字符串是否包含句点”。示例:"123e4"
缺少'.'
,但通常被视为“真实”。
string 可以成功地被解释为“整数”,“真实”,既可以解释为两者,也可以两者都不解释。考虑形成2个独立的测试,并分别进行评估。
C具有标准C库函数strto...()
,仅用于此目的。最好使用棚内最锋利的工具。
#include <stdlib.h>
bool is_integer(const char *s) {
char *endptr;
long long ll = strtoll(s, &endptr, 0);
if (s == endptr) return false; // no conversion;
if (*endptr) return false; // extra junk, maybe a `.`?
// maybe add tests for overflow
return true;
}
bool is_real(const char *s) {
char *endptr;
double d = strtod(s, &endptr);
if (s == endptr) return false; // no conversion;
if (*endptr) return false; // extra junk, maybe an `x`?
// maybe add tests for overflow
return true;
}
void classify(const char *s) {
bool i = is_integer(s);
bool r = is_real(s);
if (i) {
if (r) puts("Both");
else puts("Integer");
} else {
if (r) puts("Real");
else puts("Neither");
}
}
当字符串为“Both”且整数转换没有溢出时,“整数”可能优于“Real”。然而,如果“Both”与“1234567890123456789012345678901234567890”之类的输入一起出现,或许更好地用作“真实”,因为通常没有整数类型足够宽。