构造一个char指针数组

时间:2014-03-04 10:35:07

标签: c arrays

我在将getchar()的输入放入char * arr []数组时遇到了麻烦。我之所以这样做,是因为输入数据(带有命令行参数的文件)将存储在char指针数组中,以传递给execvp函数。

我正在使用getchar(),以后我可以实现一个功能,允许用户按下“标签”按钮并尝试将文件与已键入的文本匹配。

执行以下程序后,我键入:    ls -a(带有尾随空格)

显然应该运行但不会,我得到SEG 11故障。如果有人能指出我做错了什么会非常好!!

感谢。

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

int main(){

    char *arr[10];
    int l_count = 0, w_count = 0;
    char c;
    char *curLine;
    curLine = (char*)calloc(10, sizeof(char));
    while((c=getchar()) != '\n'){
        if (isspace(c)){
            curLine[l_count]='\0';
            memcpy(arr[w_count],curLine,strlen(curLine));           
            ++w_count;
            l_count=0;
        }       
        else{
            curLine[l_count]=c;
            ++l_count;
        }
    }
    arr[w_count]='\0';

    // Testing
    int i;
    for (i=0;i<2;i++){
        printf("%s, ", arr[i]);
    }
    printf("\n");

    return 0;
}

2 个答案:

答案 0 :(得分:0)

对于初学者来说,你没有为memcpy在arr中分配任何空间所以这一行     的memcpy(ARR [w_count],curLine,strlen的(curLine)); 将你的curLine复制到内存中的随机位置。同样适用于arr的所有用法。

答案 1 :(得分:0)

其实你想要这个:

int main(){
    char *arr[10];
    int l_count = 0, w_count = 0;
    char c;
    char *curLine;

    curLine = (char*)calloc(10, sizeof(char));

    while (1)
    {
        c = getchar() ;
        if (isspace(c)){
            curLine[l_count]='\0';
            arr[w_count] = curLine ;
            ++w_count;
            l_count=0;
            curLine = calloc(10, sizeof(char));
            if (c == '\n')
              break ;
        }       
        else{
            curLine[l_count]=c;
            ++l_count;
        }
    }

    // Testing
    int i;
    for (i = 0; i < w_count; i++){
        printf("%s, ", arr[i]);
    }
    printf("\n");

    // free memory
    for (i = 0; i < w_count; i++){
        free(arr[i]);
    }

    return 0;
}

这里我们也释放了最后的记忆,这是一个很好的做法,即使程序在那里结束了。

这个程序有效,即使还有更多的检查要做,例如,如果输入一个超过9个字符的单词,它将溢出calloc分配的内存,如果你输入超过10个单词il将溢出长度为10的arr数组。

在C中BTW你不会强制转换callocmallocrealloc的返回值。