指针和字符数组

时间:2015-06-08 12:50:10

标签: c arrays string pointers

以下是将一个字符串复制到另一个字符串的程序。我希望以下程序能给我一个警告或错误,但它只是工作。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void strcp(const char *source,char *dest)
{
    while(*source!='\0')
    {
        *dest++=*source++;
    }
//  *dest='\0';
}
int main(void)
{
    char source[]="This is a test string";
    int len=strlen(source);
    char *dest = (char *)calloc(len,sizeof(char));
    strcp(source,dest);
    printf("\n The destination now contains ");
    printf("%s",dest);
    return 0;
}

我在这里评论过*dest='\0' 所以*dest在字符串的末尾不包含任何空字符 但是主函数中的printf语句如何工作正常呢?我猜所有涉及字符串的函数都依赖于'\0'字符来标记字符串的结尾?

P.S。我得到了我的第一个问题的答案,但没有一个答案在下面谈到这个问题 而且我发现奇怪的是我可以直接使用指针dest%s printf中的char *temp=dest while(*temp!='\0') { printf("%c",*test++); } 说明符我刚写完主要内容中的最后一个printf来检查它是否有效可以提前导致我正在使用

printf("%s",dest)

取代doc["mentioning"].values.length

2 个答案:

答案 0 :(得分:4)

因为未定义的行为未定义

通过省略终止'\0',然后将“ string ”传递给printf() "%s"说明符,您的程序将调用未定义的行为。

我在上面写了“ string ”,因为没有终止'\0'它不是一个字符串,它只是一个字节序列,当你用{{1来终止一个字节序列时然后,它变成一个字符串。

由于你无法预测会发生什么,可能发生的一件事就是它有效。

虽然你的程序有更多问题

  1. 您分配的空间少于所需的空间。您需要'\0',因为strlen() + 1终止符,这是程序中未定义行为的真正原因。

  2. 您正在调用'\0'错误,应该是

    calloc()

    请注意,我不会写dest = calloc(1, 1 + len); ,因为它是超级的,它总是sizeof(char),它必须符合c标准的要求。

    在您的版本中,当您确实需要1尺寸为len的项目时,您将分配一个尺寸为len的项目。

  3. 备注和建议

    1. 在这种情况下不要使用1,您不需要将所有项初始化为0,因为您要立即覆盖它们,并且使用calloc()可能会隐藏内存中的错误调试器。

    2. Do not cast void * in c.

答案 1 :(得分:2)

C中的所有字符串都有一个特殊的终止字符'\0',使用strlen时不会计算。但是,所有字符串仍必须具有此特殊终止字符,否则所有字符串函数都将超过字符串的末尾。

为字符串分配内存时,需要为此终止字符添加空间,并最后添加它。

因此,您需要分配len个字符,而不是仅分配len + 1个字符。并删除strcp函数中的注释,需要添加终结符。