char xx[20][80];
void jsSort()
{int i,j,k,str;
char a;
for(i=0;i<20;i++)
{for(j=1;j<(strlen(xx[i])-2);j=j+2)
for(k=j+2;k<strlen(xx[i]);k=k+2)
if(xx[i][j]>xx[i][k])
{a=xx[i][j];xx[i][j]=xx[i][k];xx[i][k]=a;}}
}
这样算不出任何结果.
但如果我定义一个STRL 把STRL=strlen(xx[i]) 用STRL替换程序中的strlen(xx[i])就能正确得出结果;为什么一定要替换呢??
#include <stdio.h>
#include <string.h>
#include <conio.h>
char xx[20][80];
void jsSort()
{ int i,j,k,strl,half;
char temp;
for(i=0;i<20;i++)
{
for(j=0;j<strlen(xx[i])/2-1;j++)
for(k=j+1;k<strlen(xx[i])/2;k++)
if(xx[i][j]<xx[i][k])
{ temp=xx[i][j]; xx[i][j]=xx[i][k]; xx[i][k]=temp;}
for(j=half-1,k=strl-1;j>=0;j--,k--)
{ temp=xx[i][j]; xx[i][j]=xx[i][k]; xx[i][k]=temp;}
}
}
void main()
{
readDat();
jsSort();
writeDat();
}
readDat()
{
FILE *in;
int i=0;
char *p;
in=fopen("in.dat","r");
while(i<20&&fgets(xx[i],80,in)!=NULL){
p=strchr(xx[i],'\n');
if(p)*p=0;
i++;
}
fclose(in);
}
writeDat()
{
FILE *out;
int i;
system("cls");
out=fopen("out.dat","w");
for(i=0;i<20;i++){
printf("%s\n",xx[i]);
fprintf(out,"%s\n",xx[i]);
}
fclose(out);
}
这是整段程序XX中存有in.dat的的数据;并非没有初值;必须使用strl=strlen(xx);half=strl/2;替换才行.?
程序主要错在第一个for语句for(j=1;j<(strlen(xx[i])-2);j=j+2)中的(strlen(xx[i])-2)这一句。
因为strlen()函数的反回类型为unsigned int(无符号整型),因此再进行strlen(xx[i]-2的时候得到的是一个负数-2,而unsigned int是无法表示负数的,因此就被计算机转换为补码的形式来表示-2了,,也就是十进制数的4294967292,二进制形式是11111111110(具体多少个1自已算,反正前面全是1)
你可以把strlen(xx[i])强制转换为int型来测试,比如(int)strlen(xx[i]-2这样的话就能得到正确结果了。
strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含“\0”)。
头文件:string.h
格式:strlen (字符数组名)。
功能:计算给定字符串的(unsigned int型)长度,不包括'\0'在内。
说明:返回s的长度,不包括结束符NULL。
相关函数:
TCHAR.H routine _UNICODE & _MBCS not defined_MBCS defined_UNICODE defined_tcslen
应用:
#include<string.h>
#include<stdio.h>
int main(void)
{
char*s="GoldenGlobalView";
printf("%s has %d chars",s,strlen(s));
getchar();
return 0;
}