终端不允许我在-C结尾打印没有换行符的字符串指针
正如标题所说,我有一个指向字符串的指针,但是如果不在末尾打印换行符,我就无法打印出来 以下是我所拥有的:终端不允许我在-C结尾打印没有换行符的字符串指针,c,string,memory,io,output,C,String,Memory,Io,Output,正如标题所说,我有一个指向字符串的指针,但是如果不在末尾打印换行符,我就无法打印出来 以下是我所拥有的: 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); 如果没有新行,打印行不会打印任何内容。终端是空的 但
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);
它打印出信息
出了什么问题?没有什么问题。默认情况下,输出是“行缓冲”的,这意味着在您写入换行、或使用fflush强制输出、或在许多系统上对标准输入启动输入操作之前,输出不会发送到终端 顺便说一句,如果您不想担心空终止符,那么您需要限制打印:
printf("%.5s", rcv_message);
但是你应该仔细考虑一下。将null添加到分配的字符串会写入数组边界之外的内容。这是未定义的行为,而未定义的行为是无条件的坏行为,必须不惜一切代价加以避免。没有任何问题。默认情况下,输出是“行缓冲”的,这意味着在您写入换行、或使用fflush强制输出、或在许多系统上对标准输入启动输入操作之前,输出不会发送到终端 顺便说一句,如果您不想担心空终止符,那么您需要限制打印:
printf("%.5s", rcv_message);
但是你应该仔细考虑一下。将null添加到分配的字符串会写入数组边界之外的内容。这是未定义的行为,而未定义的行为是无条件的坏行为——无论如何都要避免。rcv_消息的字节数始终是strlenmessage;其中message是放入命令行参数的任何消息。在本例中,对于hello,rcv_消息是5个字节,而不是6个字节,因为我们排除了结尾处的空字节。那么,顺便问一下,如果您不担心空终止符,那么您需要限制打印:printf%.5s,rcv_消息;为什么我需要.5?否则printf怎么知道要打印多少字符?如果没有长度和终止符,您将拥有UB。如果rcv_消息包含5个字节,并且不是以null结尾的,则您无法使用纯%s打印它,因为这仅适用于以mill结尾的字符串。您可以使用%.*s并将长度作为printf的参数提供。这不会将您限制为5个字符的字符串;其中message是放入命令行参数的任何消息。在本例中,对于hello,rcv_消息是5个字节,而不是6个字节,因为我们排除了结尾处的空字节。那么,顺便问一下,如果您不担心空终止符,那么您需要限制打印:printf%.5s,rcv_消息;为什么我需要.5?否则printf怎么知道要打印多少字符?如果没有长度和终止符,您将拥有UB。如果rcv_消息包含5个字节,并且不是以null结尾的,则您无法使用纯%s打印它,因为这仅适用于以mill结尾的字符串。您可以使用%.*s并将长度作为printf的参数提供。这不会将您限制为5个字符的字符串。