char * input_buffer = malloc( sizeof( char ) );
sizeof (char)
根据定义为 1。这为单个字符分配空间,并input_buffer
指向它。
您也没有检查分配是否成功。malloc
失败时返回空指针;你应该经常检查。
并且指向的分配char
对象包含垃圾。input_buffer
char c;
while ( ( c = getchar() ) != '\n' ) {
strcat(input_buffer, &c);
}
getchar()
返回一个int
,而不是一个char
。您可以将结果分配给char
对象,但这样做会失去检测文件结尾或错误条件的能力。当没有更多字符要读取时getchar()
返回;EOF
您应该始终检查这一点,这样做需要将结果存储在int
. (EOF
是一个不等于任何有效字符的整数值。)
strcat(input_buffer, &c);
input_buffer
指向一个未初始化的char
. 您可以将其视为由单个char
元素组成的数组。的第一个参数strcat
必须已经包含一个有效的以 null 结尾的字符串,并且它必须有足够的空间来容纳该字符串以及您要附加到它的任何内容。
c
是单个对象,包含您刚刚使用strcat char* char*`char
读取的任何字符,必须指向一个有效的以空字符结尾的字符串。getchar(). The second argument to
is a
, so you've got the right type -- but that
strcat
将首先扫描指向的数组input_buffer
以找到终止'\0'
字符,以便它知道从哪里开始追加 - 它可能会扫描到不属于您声明或分配的任何对象的内存中,这可能会使您的程序崩溃。如果这没有爆炸,它将复制从 开始的字符c
,并将其传递到您不拥有的内存中。您有多种形式的未定义行为。
您不需要使用strcat
将单个字符附加到字符串;你可以分配它。
这是一个简单的例子:
char input_buffer[100];
int i = 0; /* index into input_buffer */
int c;
while ((c = getchar()) != '\n' && c != EOF) {
input_buffer[i] = c;
i ++;
}
input_buffer[i] = '\0'; /* ensure that it's properly null-terminated */
为了简单起见,我分配了一个固定大小的缓冲区而不是使用malloc
。
同样为简单起见,我省略了输入没有超过输入缓冲区末尾的任何检查。如果是这样,如果幸运的话,程序可能会崩溃;如果你不走运,它可能只是在破坏不属于你的记忆时起作用。如果输入行不太长,它会正常工作。在任何现实世界的程序中,您都需要检查这一点。
顺便说一句,这里所做的事情使用起来更容易fgets()
——但最好在稍低的水平上了解事物的工作方式。