首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

sizeof替2,strlen为31

2012-10-18 
sizeof为2,strlen为31C/C++ code#include #include #include #define MAX 200int main(int argc, char *ar

sizeof为2,strlen为31

C/C++ code
#include #include #include #define MAX 200int main(int argc, char *argv[]){    FILE *in;    float x,y,z, cart[MAX][3];    char ch, tmp[10], element[MAX][2];    int count;    if((in=fopen(argv[1],"r")) == NULL){        printf("Can't open file!");        exit(1);    }    while((ch=getc(in)) != EOF)        for(count=0; fscanf(in, "%s%f%f%f", tmp, &x, &y, &z) == 4; count++){            element[count][0]=tmp[0];            element[count][1]=tmp[1];            cart[count][0]=x;            cart[count][1]=y;            cart[count][2]=z;        }    for(count=0; element[count][0]!='\0'; count++)        printf("%d\t%s\t%d\t%d\n",count, element[count],               strlen(element[count]), sizeof(element[count]));    fclose(in);    return 0;}

输出为
mts@ubuntu-unity:~/Primer_Plus$ ./test g.gjf
 0 u12
 1CuCuCuCuCuCuCuCuCuCuCuCuCuCuCuN312
 2CuCuCuCuCuCuCuCuCuCuCuCuCuCuN292
 3CuCuCuCuCuCuCuCuCuCuCuCuCuN272
 4CuCuCuCuCuCuCuCuCuCuCuCuN252
 5CuCuCuCuCuCuCuCuCuCuCuN232
 6CuCuCuCuCuCuCuCuCuCuN212
 7CuCuCuCuCuCuCuCuCuN192
 8CuCuCuCuCuCuCuCuN172
 9CuCuCuCuCuCuCuN152
10CuCuCuCuCuCuN132
11CuCuCuCuCuN112
12CuCuCuCuN92
13CuCuCuN72
14CuCuN52
15CuN32
16 N12
17 H12
18 H12
19TvTvTv62
20TvTv42
21Tv22
*** stack smashing detected ***: ./test terminated
已放弃 (核心已转储)

1、第1行的输出中,Cu为何变为u?如何使之正常显示?

2、sizeof返回值为2,为何strlen返回值为31?element[count]的内容到底是什么?

谢谢。

这是用到的g.gjf文件:


  %chk=2-d.chk
  # pbepbe/3-21g/auto

  Title Card Required

  0 2
  Cu 0.00000000 0.00000000 0.00000000
  Cu -1.27152577 2.20234546 0.00000000
  Cu 2.54305000 0.00000000 0.00000000
  Cu 1.27152423 2.20234546 0.00000000
  Cu 0.00000000 0.00000000 6.25786859
  Cu -1.27152577 2.20234546 6.25786859
  Cu 2.54305000 0.00000000 6.25786859
  Cu 1.27152423 2.20234546 6.25786859
  Cu 1.27152474 0.73411515 4.17254272
  Cu -0.00000103 2.93646061 4.17254272
  Cu 3.81457474 0.73411515 4.17254272
  Cu 2.54304897 2.93646061 4.17254272
  Cu -0.00000051 1.46823031 2.08301468
  Cu -1.27152628 3.67057577 2.08301468
  Cu 2.54304949 1.46823031 2.08301468
  Cu 1.27152372 3.67057577 2.08301468
  N 0.52295394 1.19172963 7.72778695
  H 1.32628647 1.22326721 8.37113887
  H -0.28259955 1.24167882 8.36798725
  Tv 5.08610000 0.00000000 0.00000000
  Tv -2.54305154 4.40469092 0.00000000
  Tv 0.00000000 0.00000000 21.01084000


[解决办法]
element是一个数组,其成员是大小为2的数组,所以element[count]是大小为2的数组,strlen不正确是因为你没有加字符串结束符。
C/C++ code
    FILE *in;    float x,y,z, cart[MAX][3];    char ch, tmp[10], element[MAX][3];//改成3个字节存放字符串结束符0    int count;    if((in=fopen("c:\\test.txt","r")) == NULL){        printf("Can't open file!");        exit(1);    }    while((ch=getc(in)) != EOF)        for(count=0; fscanf(in, "%s%f%f%f", tmp, &x, &y, &z) == 4; count++){            element[count][0]=tmp[0];            element[count][1]=tmp[1];            element[count][2]=0;//字符串结束符0            cart[count][0]=x;            cart[count][1]=y;            cart[count][2]=z;        }    for(count=0; element[count][0]!='\0'; count++)        printf("%d\t%s\t%d\t%d\n",count, element[count],               strlen(element[count]), sizeof(element[count]));    fclose(in); 


[解决办法]
你把它当字符串使用,当然要保证末尾有0了,ANSC字符串是以0结尾的。
[解决办法]
strlen函数是计算字符串起始地址到结束符'\0'的距离(格式控制串的%s也是一样)。

热点排行