我在写一个getstring函数时遇到了一些麻烦,这就是我到目前为止所做的。
此致 V
const char* getstring()
{
char *buffer;
int i = 255;
buffer = (char *)malloc(i*sizeof(char));
*buffer = getchar();
while ( *buffer != '\n' )
{
buffer++;
*buffer = getchar();
}
*buffer = '\0';
const char* _temp = buffer;
return _temp;
}
int main()
{
char* temp = getstring();
for ( ;temp++ ; *temp != '\0')
{
printf("%c", *temp);
}
return 0;
}
答案 0 :(得分:2)
为什么不使用
char buffer[255];
scanf("%254s", &buffer);
或
char* buffer = readline("GO GO GO:");
答案 1 :(得分:2)
当后者指向字符串的终止_temp
时,您将buffer
设置为'\0'
。
移动线:
const char* _temp = buffer;
紧接在该行之后:
buffer = (char *)malloc(i*sizeof(char));
以便_temp
指向缓冲区的开头。
您还有其他一些问题:
请勿使用名称_temp
- 保留带有前导下划线的名称;
您需要测试不要将超过i
个字节写入缓冲区;
您应该测试malloc()
返回NULL
;
您需要测试返回getchar()
的{{1}}。这意味着您需要将EOF
结果存储在getchar()
类型的变量中,然后再将其分配给int
;
正如Michael Mrozek在评论中指出的那样,*buffer
循环中的表达方式是错误的。
......作为一种风格,for
总是1,所以乘以它是不必要的;并且在C中转换sizeof(char)
的结果是不必要的,并且被认为是不合需要的(与C ++不同,它是必需的)。
答案 2 :(得分:1)
const char* _temp = buffer;
在调用malloc
<强> 重要的: 强>
免费在buffer
中使用后分配给main()
的内存。
free(temp);
答案 3 :(得分:0)
您需要在调用malloc()
后立即跟踪分配的指针 - malloc()
返回的值 - 以便您可以将其传递回调用方。您还应该检查EOF和换行符 - 这需要int
(而不是char
)来保存getchar()
的值。至少!