Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
终端不允许我在-C结尾打印没有换行符的字符串指针_C_String_Memory_Io_Output - Fatal编程技术网

终端不允许我在-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个字符的字符串。