我试图通过在C中重新创建strcpy
函数来学习指针。只要有空格,请在输入字符串中制表符(英语字符以外的其他字符),该函数便停止工作。
有人可以解释为什么吗? 感谢所有答案
#include <stdio.h>
void strcpys(char *s, char *t);
int main() {
char *ms;
char *mt;
mt = "ABCDEFGAAA,AAAAA";
strcpys(ms, mt);
printf("%s\n", ms);
printf("%s\n", mt);
return 0;
}
void strcpys(char *s, char *t) {
while ((*s = *t) != '\0') {
s++;
t++;
}
}
答案 0 :(得分:3)
您的strcpys
函数正常,但是main
函数出现问题:
strcpys
的目标参数是未初始化的指针。这具有不确定的行为,很可能是分段错误。相反,您应该将一个pinter传递到一个char
,其大小足以容纳源中的所有字符以及一个空字节终止符。还有一些可能的改进:
strcpys
应该返回目标指针const char *
这是更正的版本:
#include <stdio.h>
char *strcpys(char *dest, const char *src);
int main() {
char ms[32];
const char *mt = "ABCDEFGAAA,AAAAA";
strcpys(ms, mt);
printf("%s\n", ms);
printf("%s\n", mt);
return 0;
}
char *strcpys(char *dest, const char *src) {
char *p = dest;
while ((*p = *src) != '\0') {
p++;
src++;
}
return dest;
}
请注意,您可以将增量合并到作业中
char *strcpys(char *dest, const char *src) {
char *p = dest;
while ((*p++ = *src++) != '\0')
continue;
return dest;
}
请注意,如果目标指针指向源字符串内部,则这两个版本均具有未定义的行为。如果目标数组和源不重叠,或者目标位于比源字符串低的地址,则函数将按预期方式工作。如果源数组和目标数组重叠,则标准strcpy
函数具有未定义的行为。