函数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";
指针就是指针,字符串就是字符串,不要混为一谈。
函数没认真看,应该问题不大。