剧透:我是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;
}
编辑:
对不起,就像凌晨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’
答案 0 :(得分:5)
以下是我看到的错误:
在substr
中,您声明char *temp;
然后使用它而不将其初始化为任何内容。这不是编译时错误,但是当您运行它时,该程序几乎肯定会崩溃,因为temp
将有效地指向随机存储器地址。这是未定义行为的情况,而C充满了它。如果你不小心,未定义的行为将无处不在,并且会吃掉你的宠物。
考虑malloc()
某些内存,或者让你的函数接收指向缓冲区的指针,它可以写入字符串的一部分。
在C语言中,您必须在使用函数之前声明函数,或者至少声明它们的原型。在main()
的声明之上,添加以下行:
char * substr(char *string, int start, int length);
const
将字符串文字分配给char*
时,该变量应声明为const
。所以改变
char *string = "abcdefghi";
到
const char *string = "abcdefghi";
您必须将功能原型更改为
char * substr(const char *string, int start, int length)
这应该是它应该首先出现的。
已添加2010-12-02:
substr()
不会添加终止空字符 substr()
函数虽然在其他任何意义上都是算法正确的,但不会向新字符串添加终止空字符。这将导致printf()
和所有其他字符串使用函数(如strlen()
,strcpy()
等)从字符串末尾运行到未分配的堆内存或堆栈内存(取决于关于如何解决&#34;未初始化的指针&#34;问题)。
要解决此问题,请在for
循环之后和return
语句之前立即添加此行:
temp[i] = '\0';
请注意,不应在 for循环中添加,因为这会产生一个长度为零的字符串。
答案 1 :(得分:1)
最明显的错误是您需要在代码中包含原型...
char * substr(char *string, int start, int length);
main()
...
否则您的程序将不会意识到substr已在主代码下面定义(作为函数)。
答案 2 :(得分:1)
首先,main
的返回类型为int
。其次,你必须在使用之前声明函数。要么重新排序main
和substr
,要么在substr
定义之前将main
的原型放入其中。第三,temp没有初始化。你要么需要malloc()
空间,要么分配一个静态缓冲区(不在堆栈上)。
答案 3 :(得分:0)
编译器问题: 没有substr的原型。如果您没有使用严格的ansi / iso标准进行编译,那么您的编译器可能会允许这样做。
一些运行时问题: 你没有为* temp分配任何空间。声明局部变量而不初始化它时,它保存一个垃圾值。由于temp是指向字符的指针,因此temp的内容是指向某个地址的指针,该地址很可能不属于您。
答案 4 :(得分:-1)
在for
循环的最后一次迭代中,i
将索引到字符串的最后位置。但是,您将start
(本例中为1)的值添加到i
,然后将索引添加到字符串中 - 这意味着您可能会获得索引 - 最后一次循环迭代时出现错误。
修复(假设我已正确诊断出问题):将i
初始化为start
,而不是将start
添加到i
。