iptton 发表于 2006-6-17 21:42

C 输出流……

网上见到一道问题:

(注:不是讨论这个程序 的实现 )

为什么:
当b指向的字符串短于a时,"the world is mad "无法显示

是不是和输出流文件stdout有关??

#include <stdio.h>
void copy(char *a,char *b)
{
    int i=0;
    while((*b=*a)!='\0')
    {
      a++;
      b++;
    }
}
void main()
{

    char *a="abcdefg";
    char *b="hij";
    copy(a,b);
    printf("The World Is Mad!\n");
    printf("The World Is Mad!\n");
    fflush(stdout);
    printf("%s\n",b);
    getch();
}

[ 本帖最后由 iptton 于 2006-6-17 23:12 编辑 ]

powerwind 发表于 2006-6-17 22:11

楼主似乎有笔误!

iptton 发表于 2006-6-17 23:06

明白意思即可……

改了下……

hjack 发表于 2006-6-22 01:07


#include<stdio.h>
void copy(char const *a,char *b)
{
while((*b=*a)!='\0')
{
    a++;
    b++;
}
}

int main()
{
char *a="abcdefg";
char *b="hijklmnop";
copy(a,b);
printf("the world is mad!\n");
fflush(stdout);
printf("%s\n",b);
return 0;
}


这样写,可以编译通过,但运行时出现 Segmentation fault错误。

错误原因,我查了一下,应该是main里声明char *a,*b;的问题。
我们知道

char a="abcdefg";//在栈上开辟20个内存空间,并给其赋初值
char *a="abcdefg";//静态存储区,常量
char *a=(char*)malloc(20);//在堆上开辟20个内存空间。


所以, 上面的错误应该是我们声明char *a="abcdefg";char *b="hijklmnop";是一个常量。

修改一下main程序如下:

int main()
{
char a="abcdefg";
char b="hijklmnop";
//下面同...
}

这样是可以编译通过并可以正常运行的。

由于我们在copy里改变是的*b指针所指的东西,所以可以把a声明为char *a="";
即main变为:

int main()
{
char *a="abcdefg";
char b="hijklmnop";
//......
}


[ 本帖最后由 hjack 于 2006-6-22 01:09 编辑 ]

hjack 发表于 2006-6-22 14:46

所以我觉得不是与输出流有关。
页: [1]
查看完整版本: C 输出流……