怎样求缓冲区的长度? main(){ char buffer[96]; scanf("%s",buffer); }假如我不知道buffer的大小为96,在程序中如何获得buffer的大小。不是实际串的大小。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 sizeof( buffer) / sizeof( buffer[0] );=96獲的元素個數.sizeof( buffer)=96*sizeof(char)..總尺寸sizeof(buffer[0])=sizof(char);..一個元素尺寸 不行char * my_strcpy(char *dest,const char* src){ int i; i = sizeof(dest); printf("%d",i); }将buffer作为第一个参数带入后输出为4,是这个指针的大小。我说的是求这个缓冲区buffer实际大小。 #include "string.h"...strlen(buffer);.... sorry ! 看错了。缓冲区的大小:sizeof( buffer) / sizeof( buffer[0] );就可以了。 main(){ char buffer[96]; scanf("%s",buffer); }将buffer作为下面第一个参数带入,输入仍为4。在main中sizeof(buffer)我当然知道可以。关键是求带入下面函数以后怎么求的96。char * my_strcpy(char *dest,const char* src){ int i; i = sizeof(dest); printf("%d",i); } i =sizeof( buffer)或char buffer[96];CString str =buffer;i=str.GetLenght() char * my_strcpy(char *dest,const char* src){ int i; i = sizeof(dest); printf("%d",i); }想在这个函数中用sizeof(src)求出96是不可能的。解决办法只能是给这个函数增加一个参数用一指明缓冲区的大小:char * my_strcpy(char *dest,const char* src,int SizeOfBuffer)不是有很多涉及到串操作的库函数和API函数都需要这个参数吗? char * my_strcpy(char *dest,const char* src){ int i; i = sizeof(dest); printf("%d",i); }中如果dest是一个字符串指针,是可以用strlen来计算实际长度的,但是如果是一个非NULL结尾的指针,就只能将长度也传进来,否则没法知道长度。 //string functions is defined here#ifdef USE_STRING_INC51 #define _far_ far#else #define _far_#endif unsigned char _far_ * StrCat(unsigned char _far_ * s1,unsigned char _far_ * s2 ) { unsigned char _far_ * ptr; ptr = s1; while ( * s1 ) s1++; while ( * s1++ = * s2++ ) ; return ( ptr ); }unsigned char _far_ * StrCpy(unsigned char _far_ * s1,unsigned char _far_ * s2 ){ unsigned char _far_ * ptr = s1; while (* s1++ = * s2++ ) ; return ( ptr ); }int StrCmp(unsigned char _far_ *s1,unsigned char _far_ * s2 ){ for ( ; *s1 == *s2; s1++, s2++ ) { if ( *s1 == '\0' ) return( 0 ); } return( ( int )*s1 - ( int )*s2 ); }int StrLen(unsigned char _far_ *s ) { unsigned char _far_ *ptr; ptr = s; while ( *s ) s++; return ( s - ptr ); }long StrToL(unsigned char _far_ *s ){ unsigned char _far_ * ptr; long sum=0; int i=0,j,k=0; long pow=1; ptr=s; while (*(++ptr)) k++; ptr--; k++; while (k) { k--; pow=1; for(j=0;j<i;j++) pow=pow*16; if (*ptr>=0x30 && *ptr<=0x39) sum+= (*ptr-0x30)*pow; else { if ((*ptr=='A')||(*ptr=='a')) { sum+=10*pow; } if ((*ptr=='B')||(*ptr=='b')) sum+=11*pow; if ((*ptr=='C')||(*ptr=='c')) sum+=12*pow; if ((*ptr=='D')||(*ptr=='d')) sum+=13*pow; if ((*ptr=='E')||(*ptr=='e')) sum+=14*pow; if ((*ptr=='F')||(*ptr=='f')) sum+=15*pow; } ptr--; i++; } return sum;}void ItoA(long value,unsigned char _far_ p[],int l){ int i,k,j; long m[10],n[10]; for(i=0;i<10;i++) p[i]='0'; for(k=0;k<10;k++) { m[k]=0; n[k]=0; } if(l==16) { if(value<16) { if(value<10) p[0]=48+(int)value; else { switch(value) { case 10: p[0]='A'; break; case 11: p[0]='B'; break; case 12: p[0]='C'; break; case 13: p[0]='D'; break; case 14: p[0]='E'; break; default: p[0]='F'; } } p[1]='\0'; } else { i=0,k=0; m[k]=value/16; n[k]=value%16; while(m[k]>16) { k++; m[k]=m[k-1]/16; n[k]=m[k-1]%16; } k++; n[k]=m[k-1]%16; for(j=0;j<k+1;j++) { if(n[k-j]<10) p[j]=n[k-j]+48; if(n[k-j]>=10 && n[k-j]<16) p[j]=n[k-j]+55; } p[j]='\0'; } }} StrCpy给你了,奉送StrCat,StrCmp,StrLen,StrToL,ItoA该把分给我吧YooY(www) 同意webber84(糕鱼昏) 增加一個參數.直接把sizeof(buffer)/sizeof(buffer[0])傳進來.... sizeof(buffer)是不可能的,sizeof(buffer)/sizeof(buffer[0])也是不现实的!你们可以试试看!凭我多年经验,不用费心思想的,一般缓冲区都要自己指定大小的,否则系统无法知道,这个就是C语言指针容易出错的原因之一!如果真的要知道那么你必须了解C语言如何分配内存的,然后根据它实现的特点去读取长度! 看来是所问非所答 YooY不过没什么,大家研究研究也好"...一般缓冲区都要自己指定大小的,否则系统无法知道,这个就是C语言指针容易出错的原因之一!“这可是真的哦! windows 内存管理+资源分配+进程管理 这些都难啊,那位有这三方面的资料介绍点,我也想了解了解! 问个菜鸟问题,如何删除导入的一个类? 如何让下面一条代码等待让一条的代码结束后再执行 用sleep不行 请大家指教 显示文件复制的进度条编程的问题. 程序改错,我想添加,他反而减少,大家看看是不是程序有错啊!我觉得没错啊! 怎样做动态连接库啊 感谢 lemonna(燕子)解决了我的问题 如何读取注册表二进制值,我知道用RegQueryValueEx但不知道具体代码该怎么写 怎样把CComboBox的焦点释放掉? SOS!!! 在线等待!!! HELP ME!!! 求MPEG2的I帧解码的相关算法 socket中的一些小问题(连载) 请教微软专家,关于midl编译以及类型库导入的问题。
sizeof( buffer)=96*sizeof(char)..總尺寸
sizeof(buffer[0])=sizof(char);..一個元素尺寸
char * my_strcpy(char *dest,const char* src)
{
int i;
i = sizeof(dest);
printf("%d",i);
}
将buffer作为第一个参数带入后输出为4,是这个指针的大小。
我说的是求这个缓冲区buffer实际大小。
...
strlen(buffer);
....
缓冲区的大小:sizeof( buffer) / sizeof( buffer[0] );就可以了。
{
char buffer[96];
scanf("%s",buffer);
}将buffer作为下面第一个参数带入,输入仍为4。
在main中sizeof(buffer)我当然知道可以。
关键是求带入下面函数以后怎么求的96。
char * my_strcpy(char *dest,const char* src)
{
int i;
i = sizeof(dest);
printf("%d",i);
}
或
char buffer[96];CString str =buffer;
i=str.GetLenght()
{
int i;
i = sizeof(dest);
printf("%d",i);
}
想在这个函数中用sizeof(src)求出96是不可能的。解决办法只能是给这个函数增加一个参数用一指明缓冲区的大小:
char * my_strcpy(char *dest,const char* src,int SizeOfBuffer)
不是有很多涉及到串操作的库函数和API函数都需要这个参数吗?
{
int i;
i = sizeof(dest);
printf("%d",i);
}
中如果dest是一个字符串指针,是可以用strlen来计算实际长度的,但是如果是一个非NULL结尾的指针,就只能将长度也传进来,否则没法知道长度。
//string functions is defined here
#ifdef USE_STRING_INC51
#define _far_ far
#else
#define _far_
#endif
unsigned char _far_ * StrCat(unsigned char _far_ * s1,unsigned char _far_ * s2 )
{
unsigned char _far_ * ptr;
ptr = s1;
while ( * s1 ) s1++;
while ( * s1++ = * s2++ ) ;
return ( ptr );
}unsigned char _far_ * StrCpy(unsigned char _far_ * s1,unsigned char _far_ * s2 )
{
unsigned char _far_ * ptr = s1;
while (* s1++ = * s2++ ) ;
return ( ptr );
}int StrCmp(unsigned char _far_ *s1,unsigned char _far_ * s2 )
{
for ( ; *s1 == *s2; s1++, s2++ )
{
if ( *s1 == '\0' ) return( 0 );
}
return( ( int )*s1 - ( int )*s2 );
}int StrLen(unsigned char _far_ *s )
{
unsigned char _far_ *ptr;
ptr = s;
while ( *s ) s++;
return ( s - ptr );
}long StrToL(unsigned char _far_ *s )
{
unsigned char _far_ * ptr;
long sum=0;
int i=0,j,k=0;
long pow=1;
ptr=s;
while (*(++ptr)) k++;
ptr--;
k++;
while (k)
{
k--;
pow=1;
for(j=0;j<i;j++)
pow=pow*16;
if (*ptr>=0x30 && *ptr<=0x39)
sum+= (*ptr-0x30)*pow;
else
{
if ((*ptr=='A')||(*ptr=='a'))
{
sum+=10*pow;
}
if ((*ptr=='B')||(*ptr=='b'))
sum+=11*pow;
if ((*ptr=='C')||(*ptr=='c'))
sum+=12*pow;
if ((*ptr=='D')||(*ptr=='d'))
sum+=13*pow;
if ((*ptr=='E')||(*ptr=='e'))
sum+=14*pow;
if ((*ptr=='F')||(*ptr=='f'))
sum+=15*pow;
}
ptr--;
i++;
}
return sum;
}void ItoA(long value,unsigned char _far_ p[],int l)
{
int i,k,j;
long m[10],n[10];
for(i=0;i<10;i++)
p[i]='0';
for(k=0;k<10;k++)
{
m[k]=0;
n[k]=0;
}
if(l==16)
{
if(value<16)
{
if(value<10)
p[0]=48+(int)value;
else
{
switch(value)
{
case 10: p[0]='A';
break;
case 11: p[0]='B';
break;
case 12: p[0]='C';
break;
case 13: p[0]='D';
break;
case 14: p[0]='E';
break;
default: p[0]='F';
}
}
p[1]='\0';
}
else
{
i=0,k=0;
m[k]=value/16;
n[k]=value%16;
while(m[k]>16)
{
k++;
m[k]=m[k-1]/16;
n[k]=m[k-1]%16;
}
k++;
n[k]=m[k-1]%16;
for(j=0;j<k+1;j++)
{
if(n[k-j]<10) p[j]=n[k-j]+48;
if(n[k-j]>=10 && n[k-j]<16) p[j]=n[k-j]+55;
} p[j]='\0';
}
}
}
该把分给我吧YooY
(www)
增加一個參數.直接把sizeof(buffer)/sizeof(buffer[0])傳進來.
...
sizeof(buffer)/sizeof(buffer[0])也是不现实的!你们可以试试看!
凭我多年经验,不用费心思想的,一般缓冲区都要自己指定大小的,否则系统无法知道,这个就是C语言指针容易出错的原因之一!如果真的要知道那么你必须了解C语言如何分配内存的,然后根据它实现的特点去读取长度!
不过没什么,大家研究研究也好"...一般缓冲区都要自己指定大小的,否则系统无法知道,这个就是C语言指针容易出错的原因之一!“
这可是真的哦!
那位有这三方面的资料介绍点,我也想了解了解!