繁体   English   中英

构造一个char指针数组

[英]Constructing a char pointer array

我在将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;
}

好吧,对于初学者来说,您没有在arr中为memcpy分配任何空间,因此这一行memcpy(arr [w_count],curLine,strlen(curLine)); 正在将您的curLine复制到内存中的随机位置。 以后对arr的所有用法类似。

实际上,您需要这样做:

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将溢出arr数组,长度为10。

顺便说一句,在C中,您不callocmallocrealloc的返回值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM