如何解决strcpy和自定义函数中的字符串都发生了什么?
我最近使用的字符串函数一直很好。因此,我做了第三个字符串函数,基本上就像strcpy()
:
#include <stdio.h>
#include <string.h>
const char *copy_str(const char *str);
int main() {
char name[256];
printf("What's your name? "); scanf("%255s",name);
char result[256] = copy_str(name);
printf("Hello,%s.\n",result);
}
const char *copy_str(const char *str) {
return str;
}
我没有在自己编写的函数中尝试使用strcpy()
函数本身,因为我对此并不十分熟悉。然后我得到一个错误:
copy_str.c:9:10: error: array initializer must be an initializer list or string literal
char result[256] = copy_str(name);
^
我通过以下方式解决了该问题:
int main() {
char name[256];
printf("What's your name? "); scanf("%255s",name);
char result[256];
strcpy(name,result);
printf("Hello,result);
}
但是输出结果如下:
What's your name? builderman
Hello,.
由于某种原因没有字符串。即使您输入了不同的字符串,结果也将相同。
问:为什么strcpy()
毁了我的琴弦?有什么方法可以改善我的功能?
解决方法
我将尝试部分回答您的问题。
-
copy_str.c:9:10:错误:数组初始化程序必须是初始化程序列表或字符串文字
字符结果[256] = copy_str(name);
此错误的意思是,在C语法中,您无法像以前那样初始化数组。 您只能使用以下任意一种文字来初始化字符数组:
char name[] = "Hello";
或类似的初始化列表:
char name[] = {'H','e','l','o'};
您无法使用指向char(这是函数的返回值)的指针来初始化数组
-
strcpy不会神奇地将整个字符串复制到另一个字符串,而是对字符串进行迭代直到找到NULL终止符'\ 0' 因此,strcpy的简单实现可以是:
char *StrCpy(char *dest,const char *src) { char *returned_str = dest; while (*src != '\0') { *dest = *src; src++; dest++; } *dest = '\0'; return returned_str; }
因此strcpy遍历字符串并将每个字符从dest复制到src。 发送在数组末尾没有空终止符的字符数组时,可能会出现问题,这就是字符串应以C结尾的方式。
,函数strcpy
具有以下声明
char *strcpy(char * restrict s1,const char * restrict s2);
这是第一个参数,用于定义第二个参数指向的字符串要复制到的数组。
但是在您的程序中
int main() {
char name[256];
printf("What's your name? "); scanf("%255s",name);
char result[256];
strcpy(name,result);
printf("Hello,%s.\n",result);
}
您要将未初始化的字符数组result
复制到数组name
中。
你必须写
strcpy( result,name );
代替
strcpy(name,result);
对于第一个程序,功能copy_str
是多余的。你可以写
char result[256] = name;
但是,由于数组隐式转换为指向其第一个元素的指针,因此初始化方法的类型为char *
。因此,这样的数组初始化是不正确的。您可以使用字符串文字(如
char s[] = "Hello";
但是您不能使用字符指针来初始化字符数组,例如
char t[] = "Hello";
char s[] = t;
您的函数copy_str
的外观可能如下
char * copy_str( char *dsn,const char *src )
{
for ( char *p = dsn; ( *p++ = *src++ ); );
return dsn;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。