2014-05-05 41 views
0

我试过atoi()函数和strtol()函数但没有得到所需的输出。如何将字符串转换为数值输入一样是一千输出应该是1000 感谢作为字符串输入和输出为int例如输入是一个输出应该是1

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



int main() 
{ 
    int i; 
    char buffer [256]; 

    printf ("Enter a number: "); 
    fgets (buffer, 256, stdin); 

    i = atoi (buffer); 
    printf ("The value entered is %d.",i); 

    return 0; 
} 
+0

'atoi()'不是方法,它会将''1“' - string转换为int'1'。您必须编码以检查输入的字符串并将其作为编号返回。我想,很多'if-else if'。 – Rohan

+0

http://stackoverflow.com/questions/3420629/convert-string-to-integer-sscanf-or-atoi – brokenfoot

+0

是不是很长。如果其他如果 – Jill

回答

0

与strtol,的atoi只能进行类型转换。他们不知道的价值是什么。

他们只是转换整数599至599串..但不是 “599”

http://www.tutorialspoint.com/c_standard_library/c_function_strtol.htm

http://www.tutorialspoint.com/c_standard_library/c_function_atoi.htm

+0

这不是一个答案。它只是澄清'atoi'和所有的用法。它不回答真正的问题'如何转换?'。请将其作为OP的问题 –

+0

的评论发布,如果其他如果是唯一的选择? – Jill

+1

我没有权限直接发表评论... – alluhur

1

在自然语言解析数是不平凡的。您可以使用字符串匹配来检测小数字,并且很容易通过分割数字来解析数字,例如“二十三”,但一般方法很困难。例如,“三十万”中的“百”这个词是指十万分之一,而不是十万分之一。

对此,没有库函数,因为数字更好,更普遍表示为十进制数。而且,这样的功能只能以一种语言工作。

但你可以推出自己的。下面的代码将单词分成有价值的块(例如四,二十三)和乘数(例如千)。两者都是可选的。它保留了一堆这样的值乘数对以跟踪“优先级”:“一万四千”意味着(1 * 100 + 4) * 1000,但是“一千零一四”意味着1 * 1000 + 1 * 100 + 4。当第一个乘数小于以下值时,首先进行评估。

该代码区分大小写,但它可以处理字符串文字。一个小测试套件位于下面的main函数中。

#include <stdlib.h> 
#include <stdio.h> 
#include <stdint.h> 
#include <inttypes.h> 



static const char *next(const char **p, int *len) 
{ 
    const char *t = NULL; 

    while (**p == ' ' || **p == '-') (*p)++; 
    if (**p == '\0') return NULL; 

    t = *p; 
    while (**p && **p != ' ' && **p != '-') (*p)++; 
    if (len) *len = *p - t; 

    return t; 
} 

static int eq(const char *q, const char *p, int len) 
{ 
    if (p == NULL) return 0; 

    while (len--) { 
     if (*p != *q) return 0; 
     if (*p == '\0' || *q == '\0') return 0; 
     p++; q++; 
    } 

    return (*q == '\0'); 
} 

static int in(const char **q, const char *p, int len) 
{ 
    int ix = 0; 

    if (p == NULL) return 0; 

    while (*q) { 
     if (eq(*q, p, len)) return ix; 
     ix++; 
     q++; 
    } 

    return -1; 
} 

#define MAX 32 

int parse_num(const char *p, int64_t *n) 
{ 
    static const char *ones[] = { 
     "zero", "one", "two", "three", "four", "five", "six", 
     "seven", "eight", "nine", "ten", "eleven", "twelve", 
     "thirteen", "fourteen", "fifteen", "sixteen", 
     "seventeen", "eighteen", "nineteen", NULL 
    }; 

    static const char *tens[] = { 
     "-", "-", "twenty", "thirty", "forty", "fifty", 
     "sixty", "seventy", "eighty", "ninety", NULL 
    }; 

    int64_t value[MAX]; 
    int64_t base[MAX]; 
    int nvalue = 0; 

    const char *t; 
    int neg = 0; 
    int len; 
    int x; 

    *n = 0; 

    t = next(&p, &len); 
    if (eq("minus", t, len)) { 
     neg = 1; 
     t = next(&p, &len); 
    } 

    while (t) { 
     int64_t num = 0; 
     int64_t mult = 1; 
     int valid = 0; 

     if (nvalue && eq("and", t, len)) t = next(&p, &len); 

     x = in(tens, t, len); 
     if (x >= 0) { 
      num += x * 10; 
      t = next(&p, &len); 
      valid = 1; 
     } 

     x = in(ones, t, len); 
     if (x >= 0) { 
      num += x; 
      t = next(&p, &len); 
      valid = 1; 
     } 

     if (valid == 0) { 
      long int l; 
      char *end; 

      l = strtol(t, &end, 10); 
      if (end == p) {     
       num = l; 
       valid = 1; 
       t = next(&p, &len); 
      } 
     } 

     if (eq("quadrillion", t, len)) mult = 1000000000000000LL; 
     if (eq("trillion", t, len))  mult = 1000000000000LL; 
     if (eq("billion", t, len))  mult = 1000000000LL; 
     if (eq("million", t, len))  mult = 1000000LL; 
     if (eq("thousand", t, len))  mult = 1000LL; 
     if (eq("hundred", t, len))  mult = 100LL; 

     if (mult > 1) { 
      valid = 1; 
      t = next(&p, &len); 
     } 

     if (valid == 0) return 0;   

     if (nvalue && base[nvalue - 1] == mult) return 0; 

     while (nvalue && base[nvalue - 1] < mult) { 
      nvalue--; 
      num += value[nvalue] * base[nvalue]; 
     } 

     if (nvalue == MAX) return 0; 
     if (mult > 1 && num == 0) num = 1; 

     value[nvalue] = num; 
     base[nvalue] = mult; 
     nvalue++; 
    } 

    if (t != NULL) return 0; 
    if (nvalue == 0) return 0; 

    while (nvalue--) { 
     *n += value[nvalue] * base[nvalue]; 
    } 
    if (neg) *n = -*n; 

    return 1; 
} 

int main() 
{ 
    const char *str[] = { 
     "zero", 
     "three", 
     "minus one", 
     "ten", 
     "twenty-one", 
     "eighty", 
     "eight hundred eighty-eight", 
     "three hundred and nineteen", 
     "eleven hundred", 
     "one hundred and twenty one", 
     "twenty-four thousand", 
     "thirty thousand one", 
     "two million", 
     "two hundred thirty thousand and eleven", 
     "three million two hundred and thirty thousand and eleven", 
     "minus eight trillion", 
     "fifty-five billion one million nine thousand and twelve", 
     "one thousand million", 
     "nine hundred thousand", 
     "nine thousand hundred", 
     "one hundred thousand million", 
     "nineteen hundred eighty-four", 
     "4 billion 294 million 967 thousand 296", 
     "two thousand thousand", 
     "minus", 
     "thirty-something", 
     NULL 
    }; 
    const char **p = str; 

    while (*p) { 
     int64_t n; 
     int res; 

     res = parse_num(*p, &n); 
     if (res) { 
      printf("%18" PRId64, n); 
     } else { 
      printf("%18s", "---"); 
     } 
     printf(" %s\n", *p); 
     p++; 
    } 

    return 0; 
} 
相关问题