首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

函数strcpy和strcmp的参数传递有关问题

2013-05-02 
函数strcpy和strcmp的参数传递问题编译可通过。但是运行时出现shell command killed by signal Segmentatio

函数strcpy和strcmp的参数传递问题
编译可通过。但是运行时出现shell command killed by signal Segmentation fault。请问,跟strcpy1和strcmp1这两个函数相关的参数传递方面,错在哪了?先谢谢各位了!

#include <iostream>
#include <string.h>
#include "exercise6_10.h"
#include <cstddef>
#include <assert.h>


using namespace std;

std::size_t strlen1(char const *s) {
  assert(s);
  std::size_t len = 0;
  while (s[len])
    ++len;
  return len;
}

void strcpy1(char *d, char const *s) {
  assert(s && d);
  do {
    *d++ = *s;
  } while (*s++);
}

enum CStringOrder {
  FirstBeforeSecond = -1, Same = 0, SecondBeforeFirst = 1
};

CStringOrder strcmp1(char const *first, char const *second) {
  assert(first && second);
  /*unsigned char const *f
    = static_cast<unsigned char const*>(first);
  unsigned char const *s
  = static_cast<unsigned char const*>(second);*/
  char *f;
  *f = *first;
  char *s;
  *s = *second;
  do {
    if ((*f)<(*s))
      return FirstBeforeSecond;
    else
      if ((*s)<(*f))
        return SecondBeforeFirst;
  } while (*(s++) && *(f++));
  assert((*(s-1)==0) && (*(f-1)==0));
  return Same;
}

int main()
{
  char const *s = "painting";
  char *d;
  char const *first = "abcdef";
  char const *second = "abcdef";
  std::cout<<"strlen:"<<strlen1(s)<<"\n";
  strcpy1(d,s);
  std::cout<<"strcpy:"<<*d<<"\n";
  std::cout<<"strcmp:"<<strcmp1(first,second)<<"\n";

}

[解决办法]
进程意外退出会在当前目录下产生形如‘core.数字’的文件比如‘core.1234’
使用命令
gdb 运行程序名 core.数字
进入gdb然后使用bt命令
可以查看进程意外退出前函数调用的堆栈,内容为从上到下列出对应从里层到外层的函数调用历史。
如果进程意外退出不产生core文件,参考“ulimit -c core文件最大块大小”命令

[解决办法]
char *d; 没初始化,没给分配空间,strcpy1(d,s);肯定崩溃
感觉代码习惯不好, 定义指针最好附初值,使用指针时候最好判断一下,如:char *d=NULL;
if(NULL != d)
  strcpy1(d,s);
定义字符串,最好用带下标的:char const s[] = "painting";
下面这种写法习惯也不好:
char const *s = "painting";
指针就是指针,字符串就是字符串,不要混为一谈。
函数没认真看,应该问题不大。

热点排行