打印char数组,但不需要结尾

kse8i1jr  于 2023-06-28  发布在  其他
关注(0)|答案(3)|浏览(155)

我不明白为什么abc后面有随机字符。原因何在?如何只打印出abc?谢谢!

#include <stdio.h>

int main()
{
    char arr[3];   
    char(*ptr)[3]; // declare a pointer to an array

    arr[0] = 'a';
    arr[1] = 'b';
    arr[2] = 'c'; 

    ptr = &arr; 
    printf("%s\n", arr);
    //printf("%s\n", ptr);
    return 0;
}

fwzugrvs

fwzugrvs1#

字符串需要以\0结束。确保分配足够的空间来存储终结器。

#include <stdio.h>

int main()
{
    char arr[4];   
    char(*ptr)[4]; // declare a pointer to an array

    arr[0] = 'a';
    arr[1] = 'b';
    arr[2] = 'c'; 
    arr[3] = '\0'; // <-- terminator

    ptr = &arr; 
    printf("%s\n", arr);
    //printf("%s\n", ptr);
    return 0;
}

请注意,使用char arr[4],您的数组中将包含随机内容。如果你用

char arr[4] = "abc";

这将导致

char arr[4] = {'a', 'b', 'c', 0};

看看其他地方是如何用0填充的,这样你就不必自己设置了。

1sbrub3j

1sbrub3j2#

使用随机字符的原因是您试图使用转换说明符%s将数组输出为字符串。
但是字符数组arr不包含字符串(以零字符'\0'结束的字符序列)。
因此,要使用函数printf输出它,您可以使用以下方法:

printf( "%*.*s\n", 3, 3, arr );

来自C标准(7.21.6.1 fprintf函数)
4每个转换规格均以字符%引入。在%之后,按顺序显示以下内容:

  • 一种可选的精度,可提供…为s次转换写入的最大字节数。
7lrncoxx

7lrncoxx3#

字符串必须以0结束。
所以你必须声明4个元素的数组。

char arr[4] = "abc";

所有 printf 函数家族使用的strlen函数,读取字符串直到找到0值。所以strlen返回的内存块的长度,从数组的开头开始,以第一个零结束。这可能导致未定义的行为。

相关问题