返回信息流☆─────────────────────────────────────☆
DaiGakuSei (守るべき人) 于 (Wed Nov 12 10:12:06 2008) 提到:
问:下列函数有什么作用?并指出函数参数类型上的错误
void foo(char *s, char *t)
{
while(*s++ = *t++);
}
这个……我当时写的是把一个字符串的内容拷贝到另一个里面,错误嘛……我只知道这样把指针变量的值无限制地自加会导致对系统内存的非法操作……
唉,实在搞不懂题目了……求助啊(别告诉我印错了……)
[em40]
☆─────────────────────────────────────☆
NecPro (多啦A梦) 于 (Wed Nov 12 10:26:02 2008) 提到:
【 在 DaiGakuSei 的大作中提到: 】
: 问:下列函数有什么作用?并指出函数参数类型上的错误
: void foo(char *s, char *t)
: {
: ...................
函数作用应该是copy字符串
函数参数类型上的错误:个人觉得形参应该要加一个字符串长度的参数,防止越界。
☆─────────────────────────────────────☆
NecPro (多啦A梦) 于 (Wed Nov 12 10:28:26 2008) 提到:
字符串长度参数是约束char *s的。
char *t到结束标志符后,循环会自动退出。
☆─────────────────────────────────────☆
DaiGakuSei (守るべき人) 于 (Wed Nov 12 10:38:20 2008) 提到:
【 在 NecPro 的大作中提到: 】
: 函数作用应该是copy字符串
: 函数参数类型上的错误:个人觉得形参应该要加一个字符串长度的参数,防止越界。
题目上说“类型上错误”,缺参数不算类型错误吧?
☆─────────────────────────────────────☆
mxw5495 (阿毛) 于 (Wed Nov 12 10:42:53 2008) 提到:
char *t 最好弄成 const char *t
防止传入的指针被意外改变?
☆─────────────────────────────────────☆
sunway (sunway) 于 (Wed Nov 12 10:43:06 2008) 提到:
源字符串应该加上const?
【 在 DaiGakuSei (守るべき人) 的大作中提到: 】
: 题目上说“类型上错误”,缺参数不算类型错误吧?
☆─────────────────────────────────────☆
DaiGakuSei (守るべき人) 于 (Wed Nov 12 10:48:11 2008) 提到:
SO!!我刚看完置顶帖,说是当把一个指针指向字符串时,这个字符串是个常量,也就是说,拷贝源t应该是指向常量的指针。
char *t = "ABC"; 的正确写法应该是const char *t = "ABC";只不过c++编译器为了妥协大众习惯而不报错
多谢楼上2位……
☆─────────────────────────────────────☆
NecPro (多啦A梦) 于 (Wed Nov 12 10:50:19 2008) 提到:
【 在 mxw5495 的大作中提到: 】
: char *t 最好弄成 const char *t
: 防止传入的指针被意外改变?
正解。
忘了const了。。。
不过觉得这个程序还有问题:当char *t长度大于char *s时,越界问题在哪处理?
☆─────────────────────────────────────☆
DaiGakuSei (守るべき人) 于 (Wed Nov 12 10:51:32 2008) 提到:
【 在 NecPro 的大作中提到: 】
: 正解。
: 忘了const了。。。
: 不过觉得这个程序还有问题:当char *t长度大于char *s时,越界问题在哪处理?
嗯……那就不是考生要管的问题了~反正我觉的这题有问题……
☆─────────────────────────────────────☆
DaiGakuSei (守るべき人) 于 (Wed Nov 12 11:15:01 2008) 提到:
刚才编了下程序,还是不对。不是const的问题
应该把参数改成动态数组类型,即void foo(char s[], char t[]) 才能实现功能,否则c++编译器默认指向字符串的指针s和t都为常量(无论加不加const关键字),导致无法进行写操作。
至于我认为的指针地址会无限自加下去也是臆想的……因为当指针到达字符串末尾时会遇到'/0'使while循环结束……
这个函数唯一的缺点就是当s长度小于t时会发生越界情况。
:-C,快晕了……
☆─────────────────────────────────────☆
NecPro (多啦A梦) 于 (Wed Nov 12 11:23:24 2008) 提到:
【 在 DaiGakuSei 的大作中提到: 】
: 刚才编了下程序,还是不对。不是const的问题
: 应该把参数改成动态数组类型,即void foo(char s[], char t[]) 才能实现功能,否则c++编译器默认指向字符串的指针s和t都为常量(无论加不加const关键字),导致无法进行写操作。
: :-C,快晕了……
不会啊,我这运行得很好啊。
请问你的main()函数如何写的?
☆─────────────────────────────────────☆
sunway (sunway) 于 (Wed Nov 12 11:24:46 2008) 提到:
char *strcpy(char *dest, const char *src);
char *strncpy(char *dest, const char *src, size_t n);
libc里就是这么写的
【 在 DaiGakuSei (守るべき人) 的大作中提到: 】
: 刚才编了下程序,还是不对。不是const的问题
: 应该把参数改成动态数组类型,即void foo(char s[], char t[]) 才能实现功能,否则c++编译器默认指向字符串的指针s和t都为常量(无论加不加const关键字),导致无法进行写操作。
: :-C,快晕了……
: ...................
☆─────────────────────────────────────☆
PtwCJ (鲜的每日C|头像不是我,我是长毛贼~~) 于 (Wed Nov 12 11:30:59 2008) 提到:
你在main函数要分配一下空间再传指针阿,不然指向哪里都不知道,怎么copy阿
【 在 DaiGakuSei 的大作中提到: 】
: 刚才编了下程序,还是不对。不是const的问题
: 应该把参数改成动态数组类型,即void foo(char s[], char t[]) 才能实现功能,否则c++编译器默认指向字符串的指针s和t都为常量(无论加不加const关键字),导致无法进行写操作。
: 至于我认为的指针地址会无限自加下去也是臆想的……因为当指针到达字符串末尾时会遇到'/0'使while循环结束……
: ...................
☆─────────────────────────────────────☆
DaiGakuSei (守るべき人) 于 (Wed Nov 12 11:34:52 2008) 提到:
【 在 PtwCJ 的大作中提到: 】
: 你在main函数要分配一下空间再传指针阿,不然指向哪里都不知道,怎么copy阿
呃,开始错了……我把 *p直接指向一个字符串,结果被默认成常量了……
int _tmain(int argc, _TCHAR* argv[])
{
char *p= "abcde" ;//默认常量
const char *q = "DEFGH";
foo(p,q);
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
char str[] = "abcde";
char *p = str; //这样就对了……
const char *q = "DEFGH";
foo(p,q);
return 0;
}
☆─────────────────────────────────────☆
ydgg () 于 (Wed Nov 12 12:18:26 2008) 提到:
就是说只是src的字符串差个const?
☆─────────────────────────────────────☆
pigpigping () 于 (Wed Nov 12 20:05:22 2008) 提到:
这个题目是有给出主函数吗 如果没有的话 为什么一定要把源指针直接指字符串常量啊
为什么不能char str[]="DEFGH"; char *q=str;
这样就能用void foo(char*, char*);了呀?
☆─────────────────────────────────────☆
Samuel526 (Samuel 704) 于 (Wed Nov 12 21:34:25 2008) 提到:
为啥不给指针分配内存?????
☆─────────────────────────────────────☆
Crane (计忆邮心|晴空鹤) 于 (Wed Nov 12 21:54:41 2008) 提到:
库函数strcpy的工作方式,如果编写一个标准strcpy函数的总分值为10,下面给出几个不同得分的答案:
2分
void strcpy( char *strDest, char *strSrc )
{
while( (*strDest++ = * strSrc++) != ‘/0’ );
}
4分
void strcpy( char *strDest, const char *strSrc )
//将源字符串加const,表明其为输入参数,加2分
{
while( (*strDest++ = * strSrc++) != ‘/0’ );
}
7分
void strcpy(char *strDest, const char *strSrc)
{
//对源地址和目的地址加非0断言,加3分
assert( (strDest != NULL) && (strSrc != NULL) );
while( (*strDest++ = * strSrc++) != ‘/0’ );
}
10分
//为了实现链式操作,将目的地址返回,加3分!
char * strcpy( char *strDest, const char *strSrc )
{
assert( (strDest != NULL) && (strSrc != NULL) );
char *address = strDest;
while( (*strDest++ = * strSrc++) != ‘/0’ );
return address;
}
☆─────────────────────────────────────☆
huyuanmeix (crocodile) 于 (Wed Nov 12 23:48:19 2008) 提到:
如果只问函数参数类型上的错误的话,就是const了
☆─────────────────────────────────────☆
calmsea (CPPMM) 于 (Thu Nov 13 17:49:52 2008) 提到:
标准库中的strcpy函数如果传入的参数不是字符串而是普通的字符数组也会报运行错误的,很多东西还是要使用者自己约束的,否则函数就要写的很复杂了。。。
☆─────────────────────────────────────☆
Axler (gnraxlash) 于 (Thu Nov 13 21:52:31 2008) 提到:
6 {
7 char p[]= "abcde" ;//默认常量
8 char *q = "DEFGH";
9 printf("%s\n", p);
10 printf("%s\n", q);
11 foo(p,q);
12 printf("%s\n", p);
13 printf("%s\n", q);
14
15
16 return 0;
17 }
输出:
abcde
DEFGH
DEFGH
DEFGH
将*p 换成数组p[],因为将字符串赋值给*p从而使得其为常量相当于const char *p ?
从而不能赋值。。
☆─────────────────────────────────────☆
l071037 (曾经沧海难为水) 于 (Sat Nov 15 00:15:22 2008) 提到:
#include <iostream>
using namespace std;
void foo(char *s,char *t)
{
while(*s++=*t++);
}
main()
{
char s[20],t[20]="jiuyrwaqadcfv";
foo(s,t);
cout << s;
system("pause");
}
就复制啊,没错啊,碰到‘\0’会退出的
这是一条镜像帖。来源:北邮人论坛 / cpp / #17157同步于 2008/12/6
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
[合集] 问道笔试题……
Xer
2008/12/6镜像同步0 回复
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。