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