2009-01-25 108 views
17

如何在C中解析一个整数到string(char* || char[])?有没有一个等效于C中的Java的Integer.parseInt(String)方法?将整数解析为字符串C

+0

我想你得到了另一种方式:int Integer.parseInt(String)? – 2009-01-25 23:42:57

回答

43

如果要将整数转换为字符串,请尝试使用函数snprintf()

如果要将字符串转换为整数,请尝试使用函数sscanf()atoi()atol()

+6

如果你想错误检查,strtol或strtoul会比sscanf,atoi或atol更好。 – 2009-01-26 11:31:41

+0

`atoi`已被弃用,我不会推荐使用它。 – jacwah 2015-06-14 07:53:13

1

Java parseInt()函数解析字符串以返回一个整数。等效的C函数是atoi()。但是,这似乎不符合您的问题的第一部分。你想从一个整数转换为一个字符串,或从一个字符串转换为一个整数?

1

您还可以检查出atoi()功能(ASCII到整数)和它的亲戚,atolatoll

另外,还有一些函数,做相反的为好,即itoa()和合作。

14

为int转换为字符串:

int x = -5; 
char buffer[50]; 
sprintf(buffer, "%d", x); 

你也可以做到这一点对双打:

double d = 3.1415; 
sprintf(buffer, "%f", d); 

将字符串转换为int:

int x = atoi("-43"); 

http://www.acm.uiuc.edu/webmonkeys/book/c_guide/以了解这些功能的文档。

+5

你的代码有可能发生缓冲区溢出,但我不想计算你需要有多少位的整数才能实现。使用snprintf()。 – aib 2009-01-26 00:59:47

+1

要在那里有一个缓冲区溢出,空间为50个字符,您将需要有163位整数,假设为肯定的情况并存在空终止。 >>> math.log(10 ** 49)/math.log(2) 162.77447664948076 – Arafangion 2010-06-20 04:09:34

10

这听起来像你有一个字符串,并希望将其转换为整数,由parseInt提来看,虽然它不是从这个问题很清楚 ...

要做到这一点,使用strtol 。这个函数比atoi稍微复杂一点,但作为回报,它提供了一个更清楚的错误条件指示,因为它可以填充一个指针(调用者提供)与第一个让它感到困惑的字符的地址。然后调用者可以检查违规字符并判定该字符串是否有效。 atoi,相反,如果它丢失了,返回0,这并不总是有帮助 - 但如果你对这种行为感到满意,那么你也可以使用它。

strtol的示例使用如下。对错误的检查非常简单:如果第一个无法识别的字符不是结尾字符串的'\x0',则该字符串被认为不包含有效的int。

int ParseInt(const char *s,int *i) 
{ 
    char *ep; 
    long l; 

    l=strtol(s,&ep,0); 

    if(*ep!=0) 
     return 0; 

    *i=(int)l; 
    return 1; 
} 

该函数用整数填充* i,如果字符串包含有效整数,则返回1。否则返回0.

+0

有趣的是,这名男子页的atoi说,这是等同于: (INT)strol(STR(字符* *)NULL,10) – 2013-04-07 19:22:15

0

您可能需要查看兼容解决方案this site

0

你可以试试:

int intval; 
String stringval; 
//assign a value to intval here. 
stringval = String(intval); 

应该做的伎俩。

-1

这不是最佳解决方案。这是我的解决方案,因为有多种限制,所以如果您根据课程/教师的指导准则有限的资源,这可能非常适合您。

另外请注意,这是我自己的项目的实施一小部分,我不得不读操作数,以及数字,所以我用则GetChars。否则,如果你只需要整数,没有其他类型的角色,我喜欢用这样的:

int k; 
while (scanf("%d", &k) == 1) 

规则没有具体的,“先进的” C概念:没有字符串变量,没有结构,没有指针,没有方法不是盖的,也是唯一包含我们被允许进行的#include

所以没有简单的方法调用类似的atoi()或提供任何字符串变量的使用,我选择了只是蛮力它。

1:在使用的getchar读字符(与fgets被禁止)。返回1(退出状态1)如果 存在无效字符。对于基于Java中的parseInt的问题 1 11 13是有效的,但1 11 1a是无效的,因此对于所有值,我们都有一个有效的“字符串”,如果所有字符都是0-9,忽略空格。

2:炭的ASCII值转换为其整数值(例如,48 => 0。)

3:使用变量val来存储一个int,使得对于每个字符在一个“串”有是一个相应的整数数字。即“1234”=> 1234将它附加到一个int数组并将val设置为0以供重用。

下面的代码演示了这种算法:

int main() { 
    int i, c; 
    int size = 0; 
    int arr[10]; //max number of ints yours may differ 
    int val = 0; 
    int chars[1200]; //arbitrary size to fit largest "String" 
    int len = 0; 

    //Part 1: read in valid integer chars from stdin 
    while((c = getchar()) != EOF && (c < 58 && c > 47)) { 
     chars[len] = c; 
     len++; 
    } 

    //Part 2: Convert atoi manually. concat digits of multi digit integers and 
    //  append to an int[] 
    for(i = 0; i < len; i++){ 
    for(i = 0; i < len; i++){ 
     if(chars[i] > 47 && chars[i] < 58){ 
     while((chars[i] > 47 && chars[i] < 58)){ 
      if(chars[i] == 48) 
       c = 0; 
      if(chars[i] == 49) 
       c = 1; 
      if(chars[i] == 50) 
       c = 2; 
      if(chars[i] == 51) 
       c = 3; 
      if(chars[i] == 52) 
       c = 4; 
      if(chars[i] == 53) 
       c = 5; 
      if(chars[i] == 54) 
       c = 6; 
      if(chars[i] == 55) 
       c = 7; 
      if(chars[i] ==56) 
       c = 8; 
      if(chars[i] == 57) 
       c = 9; 
      val = val*10 + c; 
      i++; 
     } 
     arr[size] = val; 
     size++; 
     if(size > 10) //we have a check to ensure size stays in bounds 
      return 1; 
     val = 0; 
     } 
     //Print: We'll make it a clean, organized "toString" representation 
     printf("["); 
     for(i = 0; i < size-1; i++){ 
      printf("%d, ", arr[i]); 
     } 
     printf("%d]", arr[i]; 

     return 0; 

再次,这是蛮力方法,但是像我这样的,你不能用专业的人使用的方法的概念或多种C99工具的情况下,这可能是你在找什么。