C:printf char *返回奇怪的最后一个字符

时间:2016-09-26 13:05:44

标签: c arrays pointers printf

我试图理解为什么在printf()

之后我有一个奇怪的角色
char* extract_word()
{
    char* sentences = "hi! i'm a banana!";
    int starts = 4;
    int ends   = 12;
    int count;
    int nb_char = ends-starts+1;
    char* word = malloc(nb_char);
    printf("\n\n%d\n",ends-starts);
    for(count = starts; count < ends;count++)
    {
        word[count-starts] = sentences[count];
        printf("%c == \n",sentences[count]);
    }
    word[count-starts+1] = '\0';
    printf("\n\n%s",word);
    return word;
}

printf返回:

8

i ==
' ==
m ==
  ==
a ==
  ==
b ==
a ==

i'm a bau

如果我删除了'\0',我会得到类似的内容:

   'm a ba¨Á£´

2 个答案:

答案 0 :(得分:6)

在您的代码中

   word[count-starts+1] = '\0';

off-by-one,基本上这个越界访问会调用undefined behavior

您应该将代码更改为

   word[nb_char-1] = '\0';

因为,您已分配nb_char个字节,最后一个索引为nb_char-1

也就是说,在使用返回的指针之前,通过检查malloc()的返回值,始终需要检查NULL是否成功。

答案 1 :(得分:4)

如果删除snprintf printf,则无法知道字符串是否结束,并且会一直递增指针,直到它看到空值并且您冒了获得分段错误的风险。

对于最后没有0的字符串,您可以使用memcpy

同样针对您要实现的目标strncpyRewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([\w-]+)$ user.php?user=$1 [L]

查看手册页以获取更多详细信息。