当前位置: 代码迷 >> C语言 >> 求一个指针的长度
  详细解决方案

求一个指针的长度

热度:328   发布时间:2008-03-15 23:28:35.0
楼上的我的结果是12vc++6.0
----------------解决方案--------------------------------------------------------
[bo]以下是引用 [un]sunkaidong[/un] 在 2008-3-15 23:17 的发言:[/bo]

#include"string.h"
#include"stdio.h"
void fun(char *w,int n)   
{
    char t,*s1,*s2;
    s1=w;
    s2=w+n-1;  
    while(s1


若声明:
char s[]="1234567";
则有:
strlen(s)=7; 字符串长度,不统计结尾的\0;
sizeof(s)=8; 数组占据的空间大小,包含了结尾的\0;
计算数组元素个数的典型表达式:sizeof(s)/sizeof(s[0]);
若把数组作为参数传递,则会退化为相应类型的指针。
例如 function(s);在function体中,s被视为char*;
----------------解决方案--------------------------------------------------------
[bo]以下是引用 [un]simplelive[/un] 在 2008-3-15 22:58 的发言:[/bo]

fun(char *w,int n)   /*我的理解:从下面主函数知道n=7*/


我觉得这个代码是写错了的,从这个函数的意图猜测,它是想实现strrev的功能,也就是把字符串反转,但是由于它的++和--运算符位置处理不当,使这个函数的功能出错了。正确的顺序应该是:
t=*s1;
*s1++ =*s2;
*s2-- =t;

fun(char *w,int n)   /*我的理解:从下面主函数知道n=7*/
{char t,*s1,*s2;
s1=w;s2=w+n-1;   /*把字符串"1234567"的首地址赋给s1,把w+6赋予s2.*/
while(s1<s2){t=*s1++;*s1=*s2--;*s2=t;}/*s1与s2比较是不是比首地址处字符的ASCII码?t=*s1++是怎么执行的,是先将s1所指的内容赋予t,再s1指向下一个字符?还是先移向下一个字符,再把此字符赋予t呢?)*/
}
----------------解决方案--------------------------------------------------------
[bo]以下是引用 [un]sunkaidong[/un] 在 2008-3-15 23:28 的发言:[/bo]

楼上的我的结果是12vc++6.0

我在vc.net 2005 下面运行第一个例子的代码,也是strlen=5;

char *p="abcde\0fghijkl\0";
cout<<strlen(p)<<p<<endl;
getchar();
return 0;
----------------解决方案--------------------------------------------------------
#include "stdio.h"
#include<string.h>

main()
{  
   char *p="abcde\Of\0gh\0jik\0";
    printf("%d\n",strlen(p));
}
/*为了避免过多的争议还是自己上机检验一下为妙*/
好吧..诸位.
----------------解决方案--------------------------------------------------------
多多实践为妙啊!
=7.
----------------解决方案--------------------------------------------------------
int main(void)
{
    char * p= "abcde\Ofghjik\0";
    printf("%d %d\n", strlen(p), sizeof(p));
    getchar();
    return 0;
}

Input: 5 4  (非TC)
----------------解决方案--------------------------------------------------------
[bo]以下是引用 [un]cosdos[/un] 在 2008-3-16 00:37 的发言:[/bo]

int main(void)
{
    char * p= "abcde\Ofghjik\0";
    printf("%d %d\n", strlen(p), sizeof(p));
    getchar();
    return 0;
}

Input: 5 4  (非TC)


很显然,你是在win32下的环境,地址是4字节.
----------------解决方案--------------------------------------------------------
楼上的没什么意思..这个题目不同编译器答案是不一样的..如果是vc6.0它会认为指针指向得字符是常量是不允许修改的..还有的vc++6.0显示的是12..最后就是我也用vc2005只是觉得它要.net框架做出来的程序要别人也有.net框架..所以你知道的所谓答案不一定都是完美的...呵呵
----------------解决方案--------------------------------------------------------
字符串以\0作为结尾
字符串的结尾是\0,编译时将遇到的第一个\0作为字符串结尾,如果用strlen函数求字符串长度,这个长度是不将\0算在内的。可是楼主的程序中间那个不是\0,而是\o,编译器会认为这是一个转义字符,所以。。。

再说一句,NULL不是\0,\0的ASCII是0,而在STDIO.H这个头文件中是这样对NULL预定义的: #define NULL 0所以它们为0的“成因”不一样。
----------------解决方案--------------------------------------------------------
  相关解决方案