#include<stdio.h>
main(){
int i=0,j=0;
char s1[10],s2[3]="uw";
for(j=0;j<2;j++)
i+=sprintf(s1+j,"%02x",s2+j);
printf("%d",i);
return 1;
}自己写的函数,运行出来i=12,为什么呢?

解决方案 »

  1.   

    s2+j是一个栈地址,一般为0x12ffc0这样的
    %02x是打印2为16进制,不足补0,但是12ffc0是6位,你一个循环,循环了2次,每次打印6个字符,那么结果显然就是12
      

  2.   

    sprintf返回了你的字串的长度
    该函数会被执行2次,两次拼出来的字串长度和就是你的12
    说道这两次拼的字串呢,是地址的16进制表示
    你自己跟踪一下吧。
    不知道你这样的代码是用来做什么的?
      

  3.   

    sprintf returns the number of bytes stored in buffer, not counting the terminating null character。
    j=0时,i+=sprintf(s1,"%02x",s2),此时,i=8了。
    j=1时,i+=sprintf(s1+1,"%02x",s2+1);此时,i+=4.
    所以最终i=12.
      

  4.   

    请问greatws :
    我想问一下s1这个数组里面到底存了多少位?
    应该怎样用代码实现?
      

  5.   


    int len = strlen(s1);
      

  6.   


    调用一下strlen(s1)就知道了啊。我看是存了7位
      

  7.   

    不是的吧。。
    sprintf是以最后一个参数为格式的。
    那个s2[0] 为U
    s2[1] 为W看看函数解释吧。
    函数名: sprintf 
    功  能: 送格式化输出到字符串中 
    用  法: int sprintf(char *string, char *farmat [,argument,...]); 
      

  8.   

    源程序如下:运行为k=12,请问great为什么呢?我一直以为是k=2.
    还有s1存的是‘u’和‘w’的十六进制吧?谢谢!
    #include<stdio.h>
    #include<string.h>
    main(){
    int i=0,j=0,k=0;
    char s1[10],s2[3]="uw";
    for(j=0;j<2;j++)
    i+=sprintf(s1+i,"%02x",s2+j);
    k=strlen(s1);
    printf("k=%d",k);
    return 1;}
      

  9.   

    #include <stdio.h> 
    main(){ 
    int i=0,j=0; 
    char s1[10],s2[3]="uw"; 
    for(j=0;j <2;j++) 
    i+=sprintf(s1+j,"%02x",s2+j); 
    printf("%d",i); 
    return 1; 
    } #include <stdio.h> 
    #include <string.h> 
    main(){ 
    int i=0,j=0,k=0; 
    char s1[10],s2[3]="uw"; 
    for(j=0;j <2;j++) 
    i+=sprintf(s1+i,"%02x",s2+j); 
    k=strlen(s1); 
    printf("k=%d",k); 
    return 1; } 运行为k=12,请问great为什么呢?我一直以为是k=2. 
    和上面的道理一样啊,6+6,第二次循环,指针移动了6位。还有s1存的是‘u’和‘w’的十六进制吧? 
    不是,s1里边存的是他们在内存中的地址。