| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1435 人关注过本帖, 1 人收藏
标题:指针与字符串问题
只看楼主 加入收藏
我菜119
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:938
专家分:1756
注 册:2009-10-17
结帖率:98.26%
收藏(1)
已结贴  问题点数:20 回复次数:11 
指针与字符串问题
#include<stdio.h>
#include<string.h>
void insert(char *str,char *sbustr,int i)
{ char *p,*q;
  int l_str,l_sbustr;
  l_str=strlen(str);
  l_sbustr=strlen(sbustr);
  p=str+i;
  q=str+l_str;
  while(q>=p)
  {
    *(q+l_sbustr)=*q;
    q--;
  }
  for(;*sbustr!='\0';sbustr++,p++)
  {
      *p=*sbustr;
  }
  puts(str);
}
main()
{ char *str="jinsiang";
  char *sbustr="**";
  int i;
  printf("请输入一个数:");
  scanf("%d",&i);
  insert(str,sbustr,i);
}
在这个程序里有一个问题,就是在char*str="jinsiang";这出问题了,我看了别人把这修改成了个字符数组char str[10]="jinsiang";
这样编译就是对的,我想知道为什么要这样修改呢???

谢谢大虾们了!
搜索更多相关主题的帖子: 指针 字符 
2009-10-19 10:46
福尔摩斯
Rank: 5Rank: 5
等 级:贵宾
威 望:12
帖 子:4011
专家分:370
注 册:2006-8-15
收藏
得分:5 
char *str="jinsiang";

str指向的是一个 字符串  常量

常量是不能被修改的!


char str[10]="jinsiang";

则是一个字符数组,字符数组当中的储存是可以修改的!

自我放逐。。。
2009-10-19 13:03
m456m654
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:3
帖 子:783
专家分:2806
注 册:2009-9-17
收藏
得分:3 
我在tc下测试,原程序是可以编译运行的
2009-10-19 13:08
UserYuH
Rank: 12Rank: 12Rank: 12
来 自:毅华
等 级:火箭侠
威 望:8
帖 子:720
专家分:3300
注 册:2009-8-10
收藏
得分:3 
不对喽!
char *str="jinsiang"; /* 这是指针str指向一个8个字长的空间,是可以改变其值,楼主运行不对原因是在越界,你只给指针str定义"jinsiang" 9字节长度空间(还有个结束符),输出却是11字节长度空间,如str和sbustr地址是相连的,那么sbustr指向的值就会被改动,所以结果就不对,如换成数组str[11]="jinsiang运行是对的,只要数组长度大于等于11都正确 */

努力—前进—变老—退休—入土
2009-10-19 14:51
我菜119
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:938
专家分:1756
注 册:2009-10-17
收藏
得分:0 
回复 3楼 m456m654
我用的是VC++6.0的,不能够通过。

愿用余生致力编程
2009-10-19 15:40
我菜119
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:938
专家分:1756
注 册:2009-10-17
收藏
得分:0 
回复 4楼 UserYuH
我觉得你说的不对,因为在计算机内存里不是把这个字符串存储在我申请的那个指针str里,而是计算机会自动在内存里开辟一个字符数组来存储这个字符串的,而str只是指向了这个字符数组的首地址。我的这个程序我只是觉得为什么会出现我说的那个问题,就是我定义了一个char *str="jinsiang";可是在调用函数的时候为什么就会出现错误了呢?为什么要定义一个字符数组就不会出现这样的问题呢?

愿用余生致力编程
2009-10-19 15:46
我菜119
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:938
专家分:1756
注 册:2009-10-17
收藏
得分:0 
回复 4楼 UserYuH
我有再次看了你的解说,你的意思是说如果我去改动str里面的内容就不对吗?为什么不能够改动呢?还有就是你说的11字节是怎么回事?你说的“你只给指针str定义"jinsiang" 9字节长度空间(还有个结束符),输出却是11字节长度空间”这个我不太懂,可以再详细点解释一下吗?谢谢了!

愿用余生致力编程
2009-10-19 15:53
我菜119
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:938
专家分:1756
注 册:2009-10-17
收藏
得分:0 
你们谁能够给我系统讲一下动态分配空间到底应该什么时候用?谢谢了!

愿用余生致力编程
2009-10-19 15:55
jcslt
Rank: 8Rank: 8
来 自:90-xx.com
等 级:蝙蝠侠
帖 子:251
专家分:975
注 册:2009-10-10
收藏
得分:3 
*str 指针 常量的东东

www.
2009-10-19 23:23
UserYuH
Rank: 12Rank: 12Rank: 12
来 自:毅华
等 级:火箭侠
威 望:8
帖 子:720
专家分:3300
注 册:2009-8-10
收藏
得分:3 

回复 我菜119 :我再说的详细点吧。
·
程序功能是将第二个字符串往第一个字符串的第几个位置插入,第几个位置由用户输入。
定义保存第一个字符串的空间要够放下两个字符串,否则存不下。
·
详细说下程序出错的原因,从下面的主函数开始看:
·
程序代码:
#include<stdio.h> 
#include<string.h> 
void insert(char *str,char *sbustr,int i) 
{ char *p,*q; 
  int l_str,l_sbustr; 
  l_str=strlen(str);   /* str字符串长度8,l_str等于8 */
  l_sbustr=strlen(sbustr); /* sbustr字符串长度2,l_sbustr等于2 */
  p=str+i;      /* i值是3,语句执行后p指向字符串"jinsiang0"的's'位置。 */
  q=str+l_str;  /* l_str等于8,语句执行后q指向字符串"jinsiang0"的数字0的位置,也就是结束符位置。 */
  while(q>=p)  /* 看第一次循环的q指向 */
  { 
    *(q+l_sbustr)=*q; /* 这时q是指向结束符的位置,q+l_sbustr就是q+2,这个q+2是不是越界了,这时赋值到指针str所给空间以外的地址,这就出错。假如给str和sbustr分配的空间是相邻的,那这赋值就会把sbustr里的值给改了。如果不是相邻的,内存地址也充许读写操作,程序还有可能出正确结果,但也是越界犯规。 */
    q--; 
  } 
  for(;*sbustr!='\0';sbustr++,p++) 
  { 
      *p=*sbustr; 
  } 
  puts(str); 
} 
main() 
{ char *str="jinsiang"; /* 给指针分配了9字节的空间,里面的值是:jinsiang0   数字0 是结束符 */
  char *sbustr="**"; 
  int i; 
  printf("请输入一个数:"); 
  scanf("%d",&i);      /* 如输入数是:3 */
  insert(str,sbustr,i); /* 调用函数 */
} 

努力—前进—变老—退休—入土
2009-10-20 01:03
快速回复:指针与字符串问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022333 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved