2010-04-14 75 views
0

我在编写getstring函数时遇到了一些麻烦,这是我迄今为止所做的。帮助编写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; 
} 

回答

2

当后者指向字符串的终止'\0'时,您将_temp设置为buffer

移动行:

const char* _temp = buffer; 

是行之后立即:

buffer = (char *)malloc(i*sizeof(char)); 

使得_temp所指向的缓冲区的开始。

你有一些其他问题:

  1. 不要使用名称_temp - 名以一个前导下划线被保留;

  2. 您需要测试您是否不会在缓冲区中写入超过i个字节;

  3. 您应该测试malloc()返回NULL;您需要测试getchar()返回EOF。这意味着在将其分配给*buffer之前,需要将getchar()结果存储在类型为int的变量中;

  4. 正如Michael Mrozek在评论中指出的那样,for循环中的表达式是错误的。

...作为一个风格点,sizeof(char)总是1,所以乘以它是不必要的;并且在C中投入malloc()的结果是不必要的,并且被认为是不受欢迎的(不同于C++,在需要的地方)。

+0

小副作用不值得自己的答案:for循环参数是倒退 – 2010-04-14 22:17:15

+0

是现在所有的变化和它的工作正常。 甚至不能确定for循环是如何扭曲的,当我正在进行实验时,它肯定会在某个时刻出现。 谢谢, V – volting 2010-04-14 22:33:24

2

为什么不直接使用

char buffer[255]; 
scanf("%254s", &buffer); 

char* buffer = readline("GO GO GO:"); 
+0

或者:fgets(buffer,sizeof(buffer),stdin); – 2010-04-14 22:18:24

+0

不,这不是功课。我想我可以提到,函数是从ARM MCU串行获取字符串,但我认为它不相关。 我不认为他们中的任何一个选项都可以工作, 谢谢 – volting 2010-04-14 22:24:40

0

你需要跟踪分配的指针 - 由malloc()返回的值 - 立即打电话给malloc()之后可以将它传回给调用者。您还应该检查EOF以及换行符 - 并且需要int(而不是char)才能保留getchar()的值。至少!

1
const char* _temp = buffer; 

只是调用之后将上述声明malloc

重要:
免费main()使用后分配到buffer内存。

free(temp); 
+0

是忘了那么做, 谢谢, V – volting 2010-04-14 22:34:03