将int转换为char数组的函数,一些问题

时间:2014-12-28 16:12:08

标签: c arrays null char

此代码需要获取一个int数并将其转换为显示该数字的char数组: 例如:

号码324

转换为: 喜欢:

char newstr [6] = {'3','2','4','\0','\0','\0'};
  1. 我认为' \ 0'是的,对吗?
  2. 我的代码出了什么问题?

    如何将此更改为获取int数的函数并返回呈现它的char数组?

    #include <string.h>
    #include <stdlib.h>
    #include <stdio.h>
    
    void main ()
     {
       int value = 324;
       char str [6];
       char newstr [6];
       int pointer, i = 0;
    
       for(i=0; value>0; i++)
         {
            str[i] = value%10 + '0';
            value /=10;
         }
    
            str[i] = '\0';
    
       for(i=5; i>-1; i--)
         {
           if(str[i]!='\0')
            {
             newstr[pointer] = str[i];
             pointer++;  
            }
         }
    
       for (i = 0; i < 6; i++)
         {
            printf("%d  %c\n", i, newstr[i] );
         }
        printf ("shalom");
     }
    

4 个答案:

答案 0 :(得分:2)

一种简单的方法应该是调用sprintf()

char newstr[6] = {0};
sprintf(newstr, "%d", value);

在现有代码中,str看起来很{'4', '2', '3', '\0', SomethingRandom, SomethingRandom}。撤消并分配给newstr会使其{SomethingRandom, SomethingRandom, '\0', '3', '2', '4'},这绝对不是您想要的。事实上,在newstr时,您不会指定str[i] == '\0',这意味着newstr[2] == SomethingRandom

答案 1 :(得分:1)

尝试以下

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

char * itoa( int x )
{
    const unsigned int BASE = 10;
    unsigned int u = abs( x );
    size_t n = 0;
    unsigned int tmp = u;
    char *s;

    do { ++n; } while ( tmp /= BASE );

    n += x < 0;

    s = malloc( ( n + 1 ) * sizeof( char ) );

    s[n] = '\0';

    do
    {
        s[--n] = u % BASE + '0';
    } while ( u /= BASE );

    if ( x < 0 ) s[--n] = '-';

    return s;
}

int main(void) 
{
    char *s = itoa( -1234567890 );

    printf( "%s\n", s );

    free( s );

    return 0;
}

输出

-1234567890

至于你的问题你的代码有什么问题,那就完全错了。:) 例如,代码忽略等于零的数字。变量指针未初始化

int pointer, i = 0;

每个循环处理一些垃圾等等。

如果您要调查我的代码,对您会更有帮助。

答案 2 :(得分:1)

OP的代码看起来非常接近正确用于限制使用。

请勿从value>0测试开始,否则在value == 0时,结果将为""。请务必将迭代次数限制为不超过数组大小。

do {
  str[i] = value%10 + '0';
  value /=10;
  i++;
} while (value>0 && i < (6-1));

在循环中设置'\0'@timra指出随机未设置元素。

do {
  str[i] = '\0';
  i++;
} while (i < (6-1));

OP仍有2个问题,OP尚未指定该做什么:

  

值大于99999
  值&lt; 0

顺便说一句:“我认为'\ 0'是空的,对吧?” '\0'是“空字符”。这与NULL不同,即“空指针”。


“如何将其更改为获取int数的函数并返回呈现它的char数组”

OP的代码存在许多角落问题。建议一种新的方法 执行转换为本地数组,然后返回它的副本 调用代码最终应free()

#include <limits.h>

// max size needed for int.  Note 10/33 just greater than log(2)
#define INTSIZE_MAX (sizeof int * CHAR_BIT * 10 / 33 + 3)

char *intoa_alloc(int x) {
  char buf[INTSIZE_MAX];
  char *p = &buf[sizeof buf - 1];

  // Work with negative absolute value to cope with INT_MIN
  // This avoids portability problems with abs(x) approach.
  int x_negative = x < 0 ? x : -x;

  // Form string
  *p = '\0';
  do {
    *--p = '0' - x_negative % 10;
    x_negative /= 10;
  } while (x_negative);
  if (x < 0) {
    *--p = '-';
  }

  char *dest = malloc(strlen(p) + 1);
  if (dest) {
    strcpy(dest, p);
  }
  return dest;
}

答案 3 :(得分:0)

用这种简单的方法就可以做到。

int main()
{
char str [6] = "324";
printf ("%c",str[1]);
  return 0;
}