读书人

sizeof替2strlen为31

发布时间: 2012-10-18 13:46:56 作者: rapoo

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也是一样)。

读书人网 >C语言

热点推荐