剧透:我是C的绝对初学者.我很快就把这个程序扔到了一起来测试我的知识,但是我的编译器给了我错误.有什么问题,为什么?
#include <stdio.h>
void main()
{
char *string = "abcdefghi";
printf("%s\n\n", string);
printf("%s\n\n", substr(string, 1, 2));
}
char * substr(char *string, int start, int length)
{
int i;
char *temp;
for(i = 0; i < length; i++)
{
temp[i] = string[i+start];
}
return temp;
}
Run Code Online (Sandbox Code Playgroud)
编辑:
对不起,这就像凌晨1点,我一直试图解决这个问题.
错误是:
main.c: In function ‘main’:
main.c:9: warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘int’
main.c: At top level:
main.c:12: error: conflicting types for ‘substr’
Run Code Online (Sandbox Code Playgroud)
以下是我看到的错误:
在substr
你声明char *temp;
然后使用它而不将其初始化为任何东西.这不是编译时错误,但是当你运行它时,这个程序几乎肯定会崩溃,因为它temp
会有效地指向一个随机的内存地址.这是一个未定义的行为,C充满了它.未定义的行为将无处不在,如果你不小心,就吃掉你的宠物.
考虑malloc()
一些内存,或让你的函数接收一个指向缓冲区的指针,它可以写入字符串的一部分.
在C中,您必须在使用函数之前声明它们,或者至少声明它们的原型.在上面main()
的声明中,添加以下行:
char * substr(char *string, int start, int length);
Run Code Online (Sandbox Code Playgroud)
const
它有意义的地方将字符串文字分配给a时char*
,应声明该变量const
.所以改变
char *string = "abcdefghi";
Run Code Online (Sandbox Code Playgroud)
至
const char *string = "abcdefghi";
Run Code Online (Sandbox Code Playgroud)
您必须将您的函数原型更改为
char * substr(const char *string, int start, int length)
Run Code Online (Sandbox Code Playgroud)
这应该是首先应该是什么.
新增2010-12-02:
substr()
不添加终止空字符该substr()
函数虽然在其他任何意义上都是算法正确的,但不会向新字符串添加终止空字符.这将导致printf()
和所有其他字符串使用函数(如strlen()
,strcpy()
等)在字符串的末尾运行到未分配的堆内存或堆栈内存(取决于您如何解决"未初始化的指针"问题).
要解决此问题,请在for
循环之后和return
语句之前立即添加此行:
temp[i] = '\0';
Run Code Online (Sandbox Code Playgroud)
请注意,这不应该在 for循环中添加,因为这会产生创建长度为零的字符串的效果.