检查字符串中的float

时间:2016-12-19 10:32:18

标签: c arrays string floating-point

您好我想检查字符串

中的浮点数
    #include<stdio.h>
#include <math.h>
#include <ctype.h>
#include <stdlib.h>

int main(void)
{
    char qihjuq[] = "a s d a s d g g 1 2 3 1 2 3 5 5.4 d 10.4";
    int num[256];
    float digit[256];
    char let[256] = {"0"};
    int lcounter =0;
    int ncounter =0;
    int dcounter =0;

    for(int i =0; i< sizeof qihjuq; i++)
    {
         if(isalpha(*(qihjuq+i))) {
             let[lcounter] = *(qihjuq + i);
             lcounter++;
         }
         else if(isdigit(*(qihjuq+i)) && *(qihjuq+i+1) != '.') {
             num[ncounter] = *(qihjuq + i);
             ncounter++;
         }
        else if(roundf(*(qihjuq+i)) != *(qihjuq+i)) {
             digit[dcounter] = *(qihjuq + i);
             dcounter++;
         }
    }
    printf("The letters are: \n");
    for(int i =0; i< lcounter; i++)
        printf("%c ",let[i]);
    printf("The whole numbers are: \n");
    for(int i =0; i< ncounter; i++)
        printf("%c ",num[i]);


}

问题出在第二和第三,如果

else if(isdigit(*(qihjuq+i)) && *(qihjuq+i+1) != '.') {
         num[ncounter] = *(qihjuq + i);
         ncounter++;
     }
    else if(roundf(*(qihjuq+i)) != *(qihjuq+i)) {
         digit[dcounter] = *(qihjuq + i);
         dcounter++;
     }

程序必须检测是浮点数还是整数。问题是该程序正在检测10.4作为单个字符,而这些字符又将整数放入1 0 4以试图否定这一点我添加了检测。但仍有逻辑错误,因为条件不包括。后面的数字。

3 个答案:

答案 0 :(得分:1)

像这样:

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

int main(void){
    char qihjuq[] = "a s d a s d g g 1 2 3 1 2 3 5 5.4 d 10.4";
    int num[256];
    float digit[256];
    char let[256];
    int lcounter =0;
    int ncounter =0;
    int dcounter =0;

    for(int i = 0; i < sizeof(qihjuq) -1; i++){
        if(isspace(qihjuq[i]))
            continue;//skip spaces
        char work[256] = {0};
        for(int j = 0; qihjuq[i] && !isspace(qihjuq[i]); ++j, ++i)
            work[j] = qihjuq[i];//Extraction
        --i;//for next loop

        if(isalpha(*work) && !work[1]) {//one letter
            let[lcounter++] = *work;
        } else {
            char *p = work;
            int n = strtol(p, &p, 10);
            if(!*p)//convert to int succeeded (Not strict)
                num[ncounter++] = n;
            else {
                p = work;
                float f = strtod(p, &p);
                if(!*p)//convert to float succeeded (Not strict)
                    digit[dcounter++] = f;
            }
        }
    }
    printf("The letters are: \n");
    for(int i = 0; i < lcounter; i++)
        printf("%c ", let[i]);
    printf("\nThe whole numbers are: \n");
    for(int i = 0; i < ncounter; i++)
        printf("%d ", num[i]);
    puts("");
}

答案 1 :(得分:0)

我不明白你的方法。

你有 - 让它调用 - 用空格分隔的字符串中的标记。通过简单地查看一个字符,您既不能检测令牌的类型,也不能检测该令牌的值。

您有两种选择:(逻辑上它们是相同的,但实现方式不同。)

迭代提取标记的字符串,然后迭代每个标记以检测其类型。

迭代字符串并递归遍历令牌。

像这样(在浏览器中代表)

char *char_ptr = qihjuq;
do 
{
  if( char_ptr == ' ')
  {
    continue
  }

  // iterate overe the next token
  int char_set = 0x0; 
  char * start_ptr = char_ptr; // The start of an item
  do 
  {
    if( isdigit( *char_ptr) )
    { 
      char_set |= 0x01; // contains digit
    }
    else if( *char_ptr == '.' )
    {
      char_set |= 0x02;       // contains period
    }
    else if( isalpha( *char_ptr ))
    { 
      char_set |= 0x04;
    }

    break; // any other character breaks item
  } while( *char_ptr++ );

  // integers have 0x01, floats have 0x3. Other values are alphas or alphanumerics
  // you can store the result into an array, do some processing with them or whatever you want. start_ptr points to the beginning of the item_char_ptr to one char after the end.
} while ( *char_ptr++ )

可能存在一些错误,但这就是结构。

答案 2 :(得分:0)

只需使用function exchangeBoxes(a, b) { var a = "#" + a; var b = "#" + b; $(a).fadeOut( "normal", function() { $(b).fadeIn( "normal" ); }); } 阅读Dim currentCode do until rsProgramLevel.EOF currentCode = rsProgramLevel("ProgramCode") If UCase(currentCode)<>"_BML7(B)" Then Response.Write "<input type=""radio"" name=""programcode"" onclick=""onProgramCode()"" " Response.Write "value=""" & currentCode & """ " if rsProgramLevel("ProgramCode") = strProgramCode then Response.Write "checked" end if Response.Write ">" Response.Write "&nbsp;" Response.Write rsProgramLevel("LevelDescription") & " (&pound;" & FormatNumber(rsProgramLevel("ChargeValue"), 2) & ")&nbsp;&nbsp;&nbsp;" Response.Write "&nbsp;&nbsp;&nbsp;&nbsp;" End If rsProgramLevel.MoveNext loop

如果有效,double指针指向要读取的位置;如果它没有按1提前工作。

保持它直到字符串的结尾

strtod()