尝试确定字符串是否包含句点

时间:2018-03-26 22:57:18

标签: c

我试图确定字符串是否包含某个符号,特别是句点。我用这个来确定一个数字是实数还是整数。第一个条件是字符串必须包含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;
}

5 个答案:

答案 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”之类的输入一起出现,或许更好地用作“真实”,因为通常没有整数类型足够宽。