C新手:帮助简单功能

mot*_*sch 1 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;
}
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)

cdh*_*wie 5

以下是我看到的错误:

使用未初始化的指针

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循环中添加,因为这会产生创建长度为零的字符串的效果.