C语言字符串处理函数问题

Wijor 2009-07-29 08:48:18
(1)

char a[]="abc\0edf",b[]="ghl";

strcat(a,b);

printf("%s",a);

结果输出为:abcghl

函数strcat具体功能怎样?我记得好像是直接在字符串后面连接上去....

(2)

char str[8]="1234567";

printf("%s",strcpy(&str[3],&str[4]));

结果输出是:567

不是很明白,函数strcpy的返回值是什么?

会的朋友指教下.....

...全文
196 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
fx397993401 2009-07-30
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wijor 的回复:]
??
strcpy函数应该不是返回空值吧....
[/Quote]

不匹配时 返回空
nouce 2009-07-30
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 dcmorgan 的回复:]
(1)
    char a[]="abc\0edf",b[]="ghl"; 
    abc 后面的 \0 是字符串结束符,所以初始化后 a[]="abc".
    连接后自然是  abcghl .

(2)
    strcpy 作用于字符数组。
    strcpy(string1, string2) 把 string2 赋值给 string1. string1 原值被覆盖。
    不能用 strcpy(string1, string2) 直接代替  string1.
   


[/Quote]

支持!
Wijor 2009-07-30
  • 打赏
  • 举报
回复
感谢大家,终于明白了....
Wijor 2009-07-30
  • 打赏
  • 举报
回复
14楼的解释也不错,(1)我现在理解了,但我(2)我还是不明白,strcpy(&str[3],&str[4]),只是把str[4]覆盖到str[3], str[3]没了,这时str[4]是多少,strcpy(&str[3],&str[4])移动的只是str[4]吧,后面的地址应该不会随着移动才对....我觉得8楼说的对,函数strcpy的返回值应该是第一个参数的地址....
jn989 2009-07-30
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wijor 的回复:]
还有,我不是很明白strcat(a,b)后,a数组在内存中是怎样存放的....

至于(2),我知道strcpy是完全覆盖,但strcpy(&str[3],&str[4]),只是把str[4]覆盖到str[3],
str[3]没了,这时str[4]是多少,strcpy(&str[3],&str[4])移动的只是str[4]吧,后面的地址应该不会随着移动才对....
[/Quote]
strcpy返回的是第一个参数(指针、地址),这里你第一个参数是&str[3],所以返回它,又因为将&str[4]拷贝给&str[3],所以&str[3]现在指向的是567,所以结果输出为567.
另外,此时原来的a[],已经变成了123567,但是strcpy返回的不是a,所以看不到这个结果
E10714012 2009-07-30
  • 打赏
  • 举报
回复
赞成14楼关于strcpy的说法,最好不要对数组的单个字符进行此操作
Wijor 2009-07-30
  • 打赏
  • 举报
回复
12楼的解释还可以,(1)的问题我下我是明白了,但(2)的还是不明白.....
james_hw 2009-07-30
  • 打赏
  • 举报
回复
[Quote=引用楼主 wijor 的回复:]
(1)

char a[]="abc\0edf",b[]="ghl";

strcat(a,b);

printf("%s",a);

结果输出为:abcghl

函数strcat具体功能怎样?我记得好像是直接在字符串后面连接上去....

(2)

char str[8]="1234567";

printf("%s",strcpy(&str[3],&str[4]));

结果输出是:567

不是很明白,函数strcpy的返回值是什么?

会的朋友指教下.....


[/Quote]


(1)re:\0是字符串结束符,因此strcat从\0出开始连接上去,你可以试一下b设置成“gh”看看

(2)re:
a、返回值是char*,正像你打印的那样,方便实现隐式调用
b、strcpy很不保险,必须遇到\0才会停止,如果strcpy(&str[3],&str[4])变成strcpy(&str[4],&str[3])则可能打印出一大堆乱码,不建议使用,建议使用strncpy
zhangwenlang 2009-07-30
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 dcmorgan 的回复:]
(1)
    char a[]="abc\0edf",b[]="ghl"; 
    abc 后面的 \0 是字符串结束符,所以初始化后 a[]="abc".
    连接后自然是  abcghl .

(2)
    strcpy 作用于字符数组。
    strcpy(string1, string2) 把 string2 赋值给 string1. string1 原值被覆盖。
    不能用 strcpy(string1, string2) 直接代替  string1.
   


[/Quote]char a[] = "abc" char b[]="ghl" 用strcat后已经越界了,呵呵
char a[10]试试
jiang5495 2009-07-30
  • 打赏
  • 举报
回复
四楼对第一个问题的回答是对的;
八楼对第二个问题的回答是对的;
而楼主所谓的数组越界,是理解错了,你用循环输出数组时,是把它当单个字符变量处理,
而调用字符串函数时,则是以字符串进行处理,而字符串默认/0 结束
city_t 2009-07-30
  • 打赏
  • 举报
回复
'\0'字符串结尾
Wijor 2009-07-30
  • 打赏
  • 举报
回复
还有,我不是很明白strcat(a,b)后,a数组在内存中是怎样存放的....

至于(2),我知道strcpy是完全覆盖,但strcpy(&str[3],&str[4]),只是把str[4]覆盖到str[3],
str[3]没了,这时str[4]是多少,strcpy(&str[3],&str[4])移动的只是str[4]吧,后面的地址应该不会随着移动才对....
Wijor 2009-07-30
  • 打赏
  • 举报
回复
楼上的解释还可以,特别是最后一句....但有几个小问题我还不是很明白,(1)中若照你所说,最后a变为"abcghl\0\0",可在TC环境下键入以下代码:
int i;
char a[]="abc\0edf",b[]="ghl";
strcat(a,b);
for(i=0;i <11;i++)
printf("%c",a[i]);
输出结果是:abcghl ghl
并不会出现越界问题,而且在strcat(a,b)后sizeof(a),得到的是8,但你若把b数组改为:b[]="gh",
sizeof(a)后得到的结果还是8,而且不论你怎么改变b数组的大小,sizeof(a)的结果都是一样的...
selooloo 2009-07-29
  • 打赏
  • 举报
回复
(1)strcat 把b中的值接在a中'\0'后,覆盖'\0'之后的值,strcat(a,b)后,a变为"abcghl\0\0"
(2)strcpy是完全覆盖 str[4]把str[3]的值覆盖,这时 str[8]变为"123567";strcpy返回str[3]的值,所以是567

两个函数返回值都为第一个参数的指针
Wijor 2009-07-29
  • 打赏
  • 举报
回复
sizeof(a)值为9很好理解啊,但问题刚就说了,是这题的关键是strcat具体功能怎样,是怎样个连接法,不过被你们这一说,我倒觉得strcat函数的内部应该可能有for循环的语句,遇到字符串结束符则弹出循环....不然不可能知道该怎么连接上个字符串,连接到哪里....这样一想倒是也合情理....

至于strcpy的返回值嘛,我百度了下,找不到....而且翻了几本有关C的书,没找到....
qmm161 2009-07-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 dcmorgan 的回复:]
(1)
    char a[]="abc\0edf",b[]="ghl"; 
    abc 后面的 \0 是字符串结束符,所以初始化后 a[]="abc".
    连接后自然是  abcghl .

(2)
    strcpy 作用于字符数组。
    strcpy(string1, string2) 把 string2 赋值给 string1. string1 原值被覆盖。
    不能用 strcpy(string1, string2) 直接代替  string1.
   


[/Quote]
1.要看 char a[] 的内容是什么,sizeof一下就知道了,不要想当然。
2.strcpy的返回值是什么,随便一个手册上都查得到,再不行baidu一下。
Wijor 2009-07-29
  • 打赏
  • 举报
回复
(1)中我也曾考虑过字符串结束符的问题,但照你说的若初始化后 a[]="abc",那么你可以试着在TC编程环境下键入以下代码:
int i;
char a[]="abc\0edf";
for(i=0;i<7;i++)
printf("%c",a[i]);
结果输出为:abc edf
如果照你说的初始化后 a[]="abc",那么应该会出现越界问题才是....
其实这里的关键问题是函数strcat具体功能怎样,是遇到字符串结束符后再连接还是直接在后面连接...

(2)中我觉得你有点搞错了,这里的关键问题是:这个表达式strcpy(&str[3],&str[4])的返回值是多少吧....
DCMorgan 2009-07-29
  • 打赏
  • 举报
回复
(1)
char a[]="abc\0edf",b[]="ghl";
abc 后面的 \0 是字符串结束符,所以初始化后 a[]="abc".
连接后自然是 abcghl .

(2)
strcpy 作用于字符数组。
strcpy(string1, string2) 把 string2 赋值给 string1. string1 原值被覆盖。
不能用 strcpy(string1, string2) 直接代替 string1.


starcat 2009-07-29
  • 打赏
  • 举报
回复
from << C Bible>>:
/* strcpy: copy t to s; pointer version 3 */
void strcpy(char *s, char *t)
{
while (*s++ = *t++)
;
}
Wijor 2009-07-29
  • 打赏
  • 举报
回复
??
strcpy函数应该不是返回空值吧....
加载更多回复(1)

69,372

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧