将ascii代码转换为字符串

时间:2014-03-17 19:41:45

标签: c string ascii printf

我有问题将矢量中的ascii代码转换为字符串...示例...

main(){
    //Having 'abcdefhgijkl', the position 0 is 'l'.
    int x[3] ={0};
    x[2] = ('a'<<24) + ('b'<<16) + ('c'<<8) + 'd';
    x[1] = ('e'<<24) + ('f'<<16) + ('g'<<8) + 'h';
    x[0] = ('i'<<24) + ('j'<<16) + ('k'<<8) + 'l';

    int i = 0;
    char buf[12];

    while(i < sizeof(x)){
        sprintf(buf,"%d",x[i]);
        printf("%s \n", buf);
        i++;
    }
}

我的意图是打印&#39; abcdefghijkl&#39;但输出是数字......我做了很多搜索,但似乎没有任何工作,我尝试了itoa,snprintf和现在的sprintf,似乎没有任何工作。

2 个答案:

答案 0 :(得分:2)

以下是对您的计划的一些改进:

  • 要执行您要对sprintf调用执行的操作,必须使用 %s将其作为字符串读取,而不是%d,它只会给你 数字。由于这些&#34;字符串&#34;不是真正的以空字符结尾的字符串, 您必须使用%.4s将字符串的长度限制为4个字节。

  • 数组x有三个元素,但sizeof(x)返回大小 字节为12(通常)。所以为了迭代你三次 需要计算总大小除以一个元素的大小。那 会给你一些元素(一种常见的方法来做到这一点 一般来说,#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))

  • buf变量太小,你需要增加一个 12个字符的空间+ nul终止的一个字节 字符\0

  • 如果你想要&#34; abcdefghijkl&#34;作为输出,您需要反转顺序 x初始化或者您需要将循环反转以从最高编号开始 并减少到零。即使这样,你也会遇到endianess个问题。

  • 最好将循环转换为for循环。

  • 主要功能应该有适当的签名。

使用

进行测试
#include <stdio.h>

int main(int argc, char *argv[]){
    int x[3] ={0};
    x[0] = ('a'<<24) + ('b'<<16) + ('c'<<8) + 'd';
    x[1] = ('e'<<24) + ('f'<<16) + ('g'<<8) + 'h';
    x[2] = ('i'<<24) + ('j'<<16) + ('k'<<8) + 'l';

    int i;
    char buf[12 + 1];

    for (i = 0; i < sizeof(x)/sizeof(int); i++){
        sprintf(buf,"%.4s", (char *)&x[i]);
        printf("%s \n", buf);
    }
    return 0;
}

它提供以下输出:

dcba
hgfe
lkji

答案 1 :(得分:0)

以下修改过的程序将输出“abcdefghijkl”

#include <stdio.h>

main()
{

   //Having 'abcdefhgijkl', the position 0 is 'l'.
   int x[3] ={0};
   int n = 0;
   x[2] = ('a'<<24) + ('b'<<16) + ('c'<<8) + 'd';
   x[1] = ('e'<<24) + ('f'<<16) + ('g'<<8) + 'h';
   x[0] = ('i'<<24) + ('j'<<16) + ('k'<<8) + 'l';

   int i = 0;
   char buf[12+1] = {'\0'};
   char *ptr = (char*)x + sizeof(x)-1;


   while(i < sizeof(x)){
      sprintf(((char*)buf+i),"%c",*ptr);
      i++;
      ptr--; 
   } 

   printf("The string is = %s\n",buf);
}