Beginning to 编程

VC++ 方面编程文章

 

查错:下面的程序编译没问题,为什么运行会出错呢

最近在看吉林大学的C程序设计的课件,有一章讲到这个函数动手写了一下。

题目:
编写一个Insert函数实现在字符串s中的第i个位置插入字符串s1;
在VC++2005中编译这段程序没有任何的Error和warning但是运行就会错误,不知道为什么阿,请高手指点一二。

#include "stdafx.h"

#include <iostream>
using namespace std;

void Insert(char *s, char *s1, int i)
{
 char *p,*q;
 p = s + strlen(s); // p 指向s的末尾+1
 q = p + strlen(s1); //q 指向新构造的字符串的\0 
 *q = '\0';

 // 
 for(p--,q--;p>=s+i-1;)
 {
  *(p--) = *(q--);
 }

 //
 for(p=s+i-1;*s1;)
 {
  *(p++) = *(s1++);
 }
}


int _tmain(int argc, _TCHAR* argv[])
{

 char *s = "Student";
 char *s1 = "Teacher";

 Insert(s,s1,3);

// 期待的输出是StuTeacherdent;
 cout<<s;


 return 0;
}


// 还有我如果把insert函数改成下面的应该也是可以的吧

void Insert2(char *s, char *s1, int i)
{
 char *p,*q;
 p = s + strlen(s); // p 指向s的末尾+1
 q = p + strlen(s1); //q 指向新构造的字符串的\0 
 *q = '\0';

 // 
 for(p--,q--;p>=s+i-1;)
 {
  *p-- = *q--;
 }

 //
 for(p=s+i-1;*s1;)
 {
  *p++ = *s1++;
 }
}

posted on 2006-03-20 21:32 Beginning to 编程 阅读(1178) 评论(3)  编辑 收藏 引用 所属分类: 关键代码

评论

# re: 查错:下面的程序编译没问题,为什么运行会出错呢 2006-03-21 08:49 莫千聪

就你写的函数在本意上是没有问题的.但有一个前提条件是:
你的目标字符串要有足够的存储空间。
char *s = "Student";
char *s1 = "Teacher";
s,s1都是指向一个const char*的存贮空间.而且大小刚好被已有的字串填满。
所以一运行,就会出现越界存取错误。

你可以这样写
char s[256]="Student";
char *s1 ="Teacher";
这样就没问题了。。

你也可以看一下strcat, 它一样有这个要求。。
  回复  更多评论   

# re: 查错:下面的程序编译没问题,为什么运行会出错呢 2006-03-21 09:44 沐枫

错误不少:
1. *p-- = *q--; // 严重错误
Fix: *q-- = *p--;
此处是要把插入点之后的字串搬到末尾。末尾的指针是q。
2. s+i-1 // 计算错误
Fix: s+i
C/C++字串是从0开始算的,因此,不需要减一。
3. char* s = "Student"; // !!! 极其严重的错误
Fix: char s[100] = "Student";
作为目的字串,必须预留足够的空间,并且不能是const.(字串常量类型是const char*)

优化建议:
1. strlen
完全可以避免strlen的调用。strlen在这里极其浪费效率。
 你可以把这个做为练习,继续优化。
2. void Insert(char *s, char *s1, int i)
原型不好,难以让人知道哪个是源哪个是目的,并且也不安全。最好改为:
void Insert(char* dst, const char* src, int pos);
  回复  更多评论   

# re: 查错:下面的程序编译没问题,为什么运行会出错呢 2006-05-15 11:43 任我行

char *s = "Student";
char *s1 = "Teacher";
改为:
char s[] = "Student";
char s1[] = "Teacher";

一字之差。
还有不少问题。  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

统计

常用链接

留言簿(4)

随笔分类

随笔档案

文章档案

相册

BlogDev

搜索

最新评论

阅读排行榜

评论排行榜