读取输入并将其放入char指针

时间:2013-10-08 16:35:44

标签: c pointers char malloc

我做了一个关于将输入放到char指针的测试用例。当我尝试运行这个程序时,输出不正确(它变成一系列随机字符,如:_ @ $)。我打算在该char指针中打印每个元素。 我对我的代码进行了一些更改,但它仍然是错误的(与以前一样的问题)。 有人可以帮我弄清楚出了什么问题以及解决问题的方法吗?

int chara;
int counts =0;

main(){

    char *buffer=(char *)malloc(sizeof(char)*25);
    while((chara=getchar())!= EOF&& counts<25){
        *buffer++ = chara;
        printf("%c\n",*buffer);
        counts++;

    }
    *buffer = '\0';
     printf("%s\n",buffer);
     free(buffer);
}

3 个答案:

答案 0 :(得分:2)

修改您的代码。

    int chara; //getchar() returns int
    int i=0;
    char *buffer=malloc(20); //allocate correctly
    while(  ( (chara=getchar())!= EOF) && ( i!=19 ) ) { //check against EOF and check counter value to avoid input with legth greater than allocated size.
        buffer[i]= chara;   
        //use indexing with counter variable to avoid errors with free()
        // if change pointer you can't free() memory  
         printf("%c\n",buffer[i++]);
    }

    buffer[i] = '\0';
     printf("%s\n",buffer);
     free(buffer);

答案 1 :(得分:2)

由于你在循环中增加buffer的值,循环后的代码是错误的。您不能free()增加buffer,它将指向malloc()尚未返回的地址。

基本上你在做:

char *buffer = malloc(25);
...
free(buffer + length of string the user entered);

这意味着您传递给free()的地址不再与malloc()返回的地址相同,这是一个错误。

答案 2 :(得分:0)

你的另一个问题是:

    *buffer++ = chara;
    printf("%c\n",*buffer);

打印出垃圾 - 您将chara分配到buffer指向的位置,增加buffer,然后打印出buffer现在指向的(未初始化的)位置

只需打印chara