2014-03-04 73 views
0

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

我使用的是getchar(),所以我稍后可以实现一个允许用户按下'tab'按钮并尝试将文件与已输入的文本进行匹配的功能。

执行以下程序后,I型: 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; 
} 
+0

您需要为循环中的每次迭代分配一个新的读缓冲区。没有memcpy()应该是必需的,虽然'realloc()'策略可能是有保证的,如果你达到你的分配限制而不触及一些空间或EOF。你的“完成”检测应该*分配*(不是memcpy)分配的字符串指针到'arr'中的下一个槽,然后用新分配的缓冲区重新开始。 – WhozCraig

回答

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

顺便说一句,C中您没有投下返回值calloc,mallocrealloc

0

悉心为您还没有分配给的memcpy在ARR任何空间,所以这条线 的memcpy起动器(ARR [w_count],curLine,strlen的(curLine)); 正在将您的curLine复制到内存中的随机位置。类似于之后所有的arr用法。