【问题标题】:Constructing a char pointer array构造一个 char 指针数组
【发布时间】:2014-03-04 10:35:07
【问题描述】:

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

【问题讨论】:

  • 您需要为循环中的每次迭代分配一个新的读取缓冲区。不需要 memcpy() ,但如果您达到分配限制而没有达到一些空间或 EOF,则可能需要使用 realloc() 策略。您的“完成”检测应该将分配的字符串指针分配(不是 memcpy)到arr 中的下一个插槽,然后从新分配的缓冲区重新开始。

标签: c arrays


【解决方案1】:

其实你想要这个:

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 个单词会溢出溢出长度为10的arr数组。

顺便说一句,在 C 中,您不会强制转换 callocmallocrealloc 的返回值。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-26
      • 1970-01-01
      • 2015-05-21
      • 2015-10-26
      • 2018-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多