char s[]="Zhejiang"; s[strlen(s)/2-1]=0; printf("%lu#%s#",strlen(s),s);

char s[]="Zhejiang";
s[strlen(s)/2-1]=0;
printf("%lu#%s#",strlen(s),s);
为什么strlen(s)的格式控制符使用%lu而不是%d,另外最重要的是答案3#Zhe#,不懂啊求解

strlen(s)得到的结果类型是unsigned long类型,所以输出用%lu格式输出数据

char s[]="Zhejiang";

strlen(s)=8
8/2=4
4-1=3
s[strlen(s)/2-1]=0; 就是s[3]=0 ;

strlen(s); //从s首地址开始统计字符数,遇到0结束。所以,strlen(s)=3
printf("%s", s ); //输出s时,也是从s首地址开始输出字符,遇到0结束。所以,输出Zhe
温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-09-23
在你使用的计算机上unsigned long和unsigned int占用字节数一样,所以可以将strlen返回的unsigned int当成lu格式输出,用%u也可以,但用%d时是输出int型数据的,与unsigned int不一致,在数据很大时理应输出一个正数时用%d可能输出的是负数。
strlen(s)=8因为字符串中有8个字符,strlen(s)/2-1=3,s数组下标3对应的字符是'j',用0将'j'替换掉后,提交给printf的s数组在计算strlen时是以数组中0的位置算作字符串尾的,所以刚才'j'前面的3个字符被计算成字符串长度strlen(s)=3,同理字符串也只输出0前面的3个字符,后面的字符还有,但无法被strlen和printf的%s识别。
第2个回答  2015-09-23
%后面的u 表示输出:十进制无符号整数
s[strlen(s)/2-1]=0; 相当于 s[3] = 0; 就是在原来的“j”的位置写入了结束符,所以后面 strlen(s) = 3。