C新手:帮助简单功能

时间:2010-12-01 22:53:07

标签: c

剧透:我是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’

5 个答案:

答案 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。其次,你必须在使用之前声明函数。要么重新排序mainsubstr,要么在substr定义之前将main的原型放入其中。第三,temp没有初始化。你要么需要malloc()空间,要么分配一个静态缓冲区(不在堆栈上)。

答案 3 :(得分:0)

编译器问题: 没有substr的原型。如果您没有使用严格的ansi / iso标准进行编译,那么您的编译器可能会允许这样做。

一些运行时问题: 你没有为* temp分配任何空间。声明局部变量而不初始化它时,它保存一个垃圾值。由于temp是指向字符的指针,因此temp的内容是指向某个地址的指针,该地址很可能不属于您。

答案 4 :(得分:-1)

for循环的最后一次迭代中,i将索引到字符串的最后位置。但是,您将start(本例中为1)的值添加到i然后将索引添加到字符串中 - 这意味着您可能会获得索引 - 最后一次循环迭代时出现错误。

修复(假设我已正确诊断出问题):将i初始化为start,而不是将start添加到i