[英]Turning ascii code to a string
我在将向量中的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++;
}
}
我的意图是打印'abcdefghijkl',但输出是数字...我做了很多搜索,但似乎没有任何效果,我尝试了fucntion itoa,snprintf和sprintf,但似乎没有任何效果。
这是您程序的一些改进:
要使用sprintf调用进行操作,必须使用%s
将其读取为字符串,而不能使用%d
来获取数字。 由于这些“字符串”不是以nul终止的真实字符串,因此必须使用%.4s
将字符串的长度限制为4个字节。
数组x具有三个元素,但是sizeof(x)返回以字节为单位的大小(通常为12)。 因此,要进行三遍迭代,您需要计算总大小除以一个元素的大小。 这将为您提供元素数量(以一种通用的方式来通用此方法,以#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
。
buf变量太小,您需要增加一个以容纳12个字符的空间+ nul终止字符\\0
一个字节。
如果希望将“ abcdefghijkl”作为输出,则需要颠倒x初始化的顺序,或者需要颠倒循环以从最大的数字开始并减小到零。 即使这样,您也遇到了忍耐问题。
该循环可以优选地被转换为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
下面经过修改的程序将输出“ 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);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.