+ -
当前位置:首页 → 问答吧 → 求高人ubuntu下安装xcode

求高人ubuntu下安装xcode

时间:2011-09-01

来源:互联网

字符数组变量nspace大小等于10的时候正常,但是等于1或2的时候就不正常了 。
测试输入(以下的制表符可能变成空格了):
代码:
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;
}

作者: weizhao   发布时间: 2011-09-01

确实有意思,在我这里的运行结果:
代码:
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

而改成char nspace[10]={' ',' ',' ',' ',' ',' ',' ',' ',' ',' '};,运行结果:
代码:
cwj@cwj-toshiba:~$ ./test
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

这就导致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

所以就正常了。我不知道为什么,可能和分配内存的策略有关系,等高人讲解。
一个解决办法是:char nspace[3]={' ',' ','\0'};

作者: wjchen   发布时间: 2011-09-01

wjchen 写道:
nspace大小为2时,nspace的起始地址位于input前面
而nspace大小为10时,nspace的起始地址位于input后面


可能是编译器优化了地址的边界对齐导致的。
http://en.wikipedia.org/wiki/Data_structure_alignment

作者: tangboyun   发布时间: 2011-09-01

不清楚你程序的意图

不过nspace应该是下面的写法吧??
char nspace[3]={' ',' ','\0'};

作者: qulcc   发布时间: 2011-09-28

热门下载

更多