求高人ubuntu下安装xcode
时间:2011-09-01
来源:互联网
字符数组变量nspace大小等于10的时候正常,但是等于1或2的时候就不正常了 。
测试输入(以下的制表符可能变成空格了):
这段代码用来分割输入的行,并把制表符换成多个空格,5列后分行
测试输入(以下的制表符可能变成空格了):
代码:
meet you how are you i am fine thank you and you? very well what meet you how are you iam fine thank you and you? very well what meet you how are you i am fine thank you and you? very well what meet you how are you i am fine thank you and you? very well what meet you how are you i am fine thank you and you? very well what meet you how are you i am fine thank you and you? very well
这段代码用来分割输入的行,并把制表符换成多个空格,5列后分行
代码:
#include <stdio.h>
#define MAXLINE 10000
int main(){
char input[MAXLINE];
getline1(input,MAXLINE);
int i,l;
int n=5;
int currenttab=0;
char nspace[2]={' ',' '};
char s[10];
int k=0;
for(i=0;i<MAXLINE && input[i]!='\0';i++){
//printf("%c\n",input[i]);
if(input[i]!='\t'){
s[k]=input[i];
k++;
}
else{
s[k]='\0';
printf("%10s",s);
k=0;
currenttab++;
printf("%s",nspace);
if((currenttab%n)==0)
printf("\n");
}
}
printf("\n");
}
int getline1(char s[],int lim){
int i;
char c;
for(i=0;i<lim-1 && (c=getchar())!=EOF && c!='\n';i++){
s[i]=c;
}
if(c=='\n'){
s[i]=c;
i++;
}
s[i]='\0';
return i;
}
#define MAXLINE 10000
int main(){
char input[MAXLINE];
getline1(input,MAXLINE);
int i,l;
int n=5;
int currenttab=0;
char nspace[2]={' ',' '};
char s[10];
int k=0;
for(i=0;i<MAXLINE && input[i]!='\0';i++){
//printf("%c\n",input[i]);
if(input[i]!='\t'){
s[k]=input[i];
k++;
}
else{
s[k]='\0';
printf("%10s",s);
k=0;
currenttab++;
printf("%s",nspace);
if((currenttab%n)==0)
printf("\n");
}
}
printf("\n");
}
int getline1(char s[],int lim){
int i;
char c;
for(i=0;i<lim-1 && (c=getchar())!=EOF && c!='\n';i++){
s[i]=c;
}
if(c=='\n'){
s[i]=c;
i++;
}
s[i]='\0';
return i;
}
作者: weizhao 发布时间: 2011-09-01
确实有意思,在我这里的运行结果:
而改成char nspace[10]={' ',' ',' ',' ',' ',' ',' ',' ',' ',' '};,运行结果:
后来用gdb看了一下,发现nspace大小为2时,nspace的起始地址位于input前面,如下:
这就导致printf("%s",nspace)的实际输出是“ a b c d e f g "(前面两个空格,后面是input的值)。
而nspace大小为10时,nspace的起始地址位于input后面:
所以就正常了。我不知道为什么,可能和分配内存的策略有关系,等高人讲解。
一个解决办法是:char nspace[3]={' ',' ','\0'};
代码:
cwj@cwj-toshiba:~$ gcc -g test.c -o test
cwj@cwj-toshiba:~$ ./test
a b c d e f g
a a b c d e f g
b a b c d e f g
c a b c d e f g
d a b c d e f g
e a b c d e f g
f a b c d e f g
g a b c d e f g
cwj@cwj-toshiba:~$ ./test
a b c d e f g
a a b c d e f g
b a b c d e f g
c a b c d e f g
d a b c d e f g
e a b c d e f g
f a b c d e f g
g a b c d e f g
而改成char nspace[10]={' ',' ',' ',' ',' ',' ',' ',' ',' ',' '};,运行结果:
代码:
cwj@cwj-toshiba:~$ ./test
a b c d e f g
a b c d e
f g
a b c d e f g
a b c d e
f g
后来用gdb看了一下,发现nspace大小为2时,nspace的起始地址位于input前面,如下:
代码:
Breakpoint 1 at 0x80484c5: file t.c, line 13.
(gdb) run
Starting program: /home/cwj/test
a b c d e f g
Breakpoint 1, main () at t.c:13
13 for(i=0;i<MAXLINE && input[i]!='\0';i++){
(gdb) print &input
$1 = (char (*)[10000]) 0xbfffcb82
(gdb) print &nspace
$2 = (char (*)[2]) 0xbfffcb80
(gdb) run
Starting program: /home/cwj/test
a b c d e f g
Breakpoint 1, main () at t.c:13
13 for(i=0;i<MAXLINE && input[i]!='\0';i++){
(gdb) print &input
$1 = (char (*)[10000]) 0xbfffcb82
(gdb) print &nspace
$2 = (char (*)[2]) 0xbfffcb80
这就导致printf("%s",nspace)的实际输出是“ a b c d e f g "(前面两个空格,后面是input的值)。
而nspace大小为10时,nspace的起始地址位于input后面:
代码:
(gdb) print &input
$1 = (char (*)[10000]) 0xbfffcb78
(gdb) print &nspace
$2 = (char (*)[10]) 0xbffff292
$1 = (char (*)[10000]) 0xbfffcb78
(gdb) print &nspace
$2 = (char (*)[10]) 0xbffff292
所以就正常了。我不知道为什么,可能和分配内存的策略有关系,等高人讲解。
一个解决办法是:char nspace[3]={' ',' ','\0'};
作者: wjchen 发布时间: 2011-09-01
wjchen 写道:
nspace大小为2时,nspace的起始地址位于input前面
而nspace大小为10时,nspace的起始地址位于input后面
而nspace大小为10时,nspace的起始地址位于input后面
可能是编译器优化了地址的边界对齐导致的。
http://en.wikipedia.org/wiki/Data_structure_alignment
作者: tangboyun 发布时间: 2011-09-01
不清楚你程序的意图
不过nspace应该是下面的写法吧??
char nspace[3]={' ',' ','\0'};
不过nspace应该是下面的写法吧??
char nspace[3]={' ',' ','\0'};
作者: qulcc 发布时间: 2011-09-28
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28