C初学者 - 指针

时间:2014-08-03 13:18:13

标签: c pointers

我在理解代码出错的地方时遇到了一些麻烦。我想存储多个字符串数组,然后显示它们;由于一些未知的原因,在我输入不同数量的行(比如说5)之后,它只会显示最后一行5次。有什么想法吗?

谢谢

#include <stdio.h>
#include <string.h>

int readLine(char line[], int max);
void printLines(char *lines[], int size);

int main(){

    char *lines[100];
    char line[100];

    int i = 0;
    int len = 0;

    char *p;

    while( (len = readline(line,100)) > 0){

        if((p = malloc(len * sizeof(char))) != NULL){

            p = line;
            lines[i++] = p;
        }
    }

    lines[i] = '\0';
    printLines(lines, i);

    return 0;
}    

int readline(char line[], int max){

    if(fgets(line,max,stdin) == NULL)
        return 0;

    printf("%d \n", strlen(line));
    return strlen(line);
}

void printLines(char *lines[], int size){

    int i;
    for(i = 0; i < size; i++)
        printf("%s\n", lines[i]);
}

2 个答案:

答案 0 :(得分:1)

这是你的问题:

if((p = malloc(len * sizeof(char))) != NULL){

    p = line;
    lines[i++] = p;

}

p是一个指向先分配存储的指针,但是它的值会被line的值覆盖。您想要的是将当前存储在line指向的位置的内容复制到p所指向的位置。其功能是strcpy()

注意:

  • sizeof (char)完全按照sizeof的定义。
  • 如果人们输入超过100个字符的行,您将遇到缓冲区溢出问题(google that term!)。
  • 你并没有真正处理malloc()失败,只是跳过一些代码而忽略它。如果malloc()失败,请写一条错误消息并立即调用exit()。将其包装在函数中以便于重用(称为xalloc())。

答案 1 :(得分:1)

if((p = malloc(len * sizeof(char))) != NULL){
    p = line;
    lines[i++] = p;

您为字符串分配内存,并将malloc()返回的指针存储在p中。然后在line中存储指向p的指针,有效地丢弃指向刚分配的内存的指针。您需要使用strcpy()或类似内容复制字符串。

    strcpy (p, line);