【问题标题】:Terminal won't let me print pointer to string without newline character at end - C终端不会让我打印指向末尾没有换行符的字符串的指针-C
【发布时间】:2014-10-25 01:08:33
【问题描述】:

所以正如标题所说,我有一个指向字符串的指针,但它不会让我在不打印最后一个换行符的情况下打印它。

这是我所拥有的:

char *rcv_message = malloc(msg_len); /* where msg_len = 5, because input is "hello" we are not supposed to worry about the null terminator */

printf("%s", rcv_message);

没有新行,打印行不会打印任何内容。终端是空白的。

但是当我在末尾添加新行时,例如:

printf("%s\n", rcv_message);

它打印出消息。

出了什么问题?

【问题讨论】:

    标签: c string memory io output


    【解决方案1】:

    没有任何问题。默认情况下,输出是“行缓冲的”,这意味着在您编写换行符或使用fflush() 强制输出或(在许多系统上)在标准输入上启动输入操作之前,输出不会发送到终端。

    顺便说一句,如果您不担心空终止符,那么您需要限制打印:

    printf("%.5s", rcv_message);
    

    但是你应该仔细考虑一下。向分配的字符串添加 null 会写入数组边界之外。那是未定义的行为,未定义的行为是无条件的坏行为——不惜一切代价避免。

    【讨论】:

    • 那么 rcv_message 的字节数总是 strlen(message);其中 message 是放入命令行参数的任何消息。所以在这种情况下,对于“hello”,rcv_message 是 5 个字节,而不是 6 个,因为我们排除了最后的空字节。
    • 那么在这种情况下,“顺便说一句,如果您不担心空终止符,那么您需要限制打印: printf("%.5s" , rcv_message);"为什么我需要 .5?
    • printf() 怎么知道要打印多少个字符?没有长度也没有终结符,你将拥有 UB。
    • 如果 rcv_message 包含 5 个字节并且不是以 null 结尾的,则不能使用普通的 %s 打印它,因为它只能(可靠地)使用以 mill 结尾的字符串。您可以使用%.*s 并将长度作为参数提供给printf()。这不会限制您使用 5 个字符的字符串。
    猜你喜欢
    • 2023-03-15
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 2021-06-28
    相关资源
    最近更新 更多