我有问题将矢量中的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,似乎没有任何工作。
答案 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);
}