在C中处理字符串

时间:2013-04-08 05:34:34

标签: c string segmentation-fault fgets

我试图在C中编写流编辑器,而且我很难处理字符串。在读取文件的行后,我想将它们本地存储在一个字符串数组中。但是,当我尝试将变量temp存储到字符串数组StoredEdits中时,出现segmentation fault (core dumped)错误。此外,如果我取消注释char* temp2变量并将其保存到我的数组中作为变通方法,则读入的最后一个值将存储为数组中的每个值。

我认为这与temp2是指针的事实有关。在每次迭代之后,我已经尝试了一百万个像malloc这样的变量和自由变量,但似乎没有任何效果。

非常感谢任何帮助。

      #define MAX_SIZE 100 
      typedef char String[MAX_SIZE];   
          int main(int argc, char* argv[]){
              char** StoredEdits;                                                                                                                                                                    
              int index, numOfEdits;
              FILE *EditFile;                                                                                                                                                                                       
              char* temp;
              //char* temp2;                                                                                                                                                                                            

              StoredEdits = (char**)malloc(MAX_INPUT_SIZE*sizeof(String));                                                                                                                                           

              /*Check to see that edit file is passed in.*/
              if(argc < 2){
                printf("ERROR: Edit File not given\n");
                return(EXIT_FAILURE);
              }

              printf("%s\n",argv[1]);

              if( (EditFile = fopen(argv[1],"r")) != NULL ){
                printf("file opened\n");
                numOfEdits = 0;
                while(fgets(temp, MAX_STRING_SIZE, EditFile) != NULL){
                  printf("%d %s",numOfEdits,temp);
                  //temp2 = temp;                                                                                                                                                                                       
                  StoredEdits[numOfEdits++] = temp;
                  //StoredEdits[numOfEdits++] = temp;
                  printf("Stored successfully\n");
                }

..........

              printf("%d\n",numOfEdits);
              for(index=0;index<numOfEdits;index++){
                printf("%d %s\n",index, StoredEdits[index]);
              }

3 个答案:

答案 0 :(得分:4)

您需要初始化temp以指向有效存储。

temp = malloc(MAX_STRING_SIZE+1);

看起来你可能打算做这样的事情:

String temp;

使用你的宏。这将作为常规char数组更好。它的通用名称是 buffer

char buffer[MAX_STRING_SIZE+1];

然后,您应该存储在数组中,而不是temp本身,而是存储包含内容副本的新字符串。 POSIX函数strdup在这里应该有用。请注意,strdup不是C标准的一部分,但它在大多数托管实现中都可用。从历史上看,它来自BSD分支。

StoredEdits[numOfEdits++] = strdup(temp);

让我稍微退一步说,如果你在 循环中为temp 分配新存储空间,那么你应该跳过strdup因为,就像Jim Balter说,这会泄漏记忆。如果您在循环之外分配temp,那么无论是静态分配(通过声明char [])还是动态(使用malloc),它都没什么区别。


顺便说一下,这条线不会给你带来太多的收获:

typedef char String[MAX_SIZE];

为什么,请参阅经典的Kernighan( K&amp; R 中的 K )论文Why Pascal is not my favorite Programming Language


另请注意,上面的示例不检查malloc返回的指针。 malloc可能会失败。当malloc失败时,它将返回NULL指针。如果您尝试通过此指针存储数据,Kaboom!

答案 1 :(得分:3)

由于指针语义,你的问题是正确的。您应该使用从temp。

复制字符串的内容
char *cpy = malloc(1 + strlen(temp));
if (cpy)
    strcpy(cpy, temp);
//else handle error
StoredEdits[numOfEdits++] = cpy;

答案 2 :(得分:0)

其他人回答了错误的原因。

但是从程序中,我看到你试图分配一个字符双数组。然后将从文件中读取的每一行存储到数组中。

StoredEdits = (char**)malloc(MAX_INPUT_SIZE*sizeof(String));

如果我的假设是正确的,那么你应该将数组传递给strcpy,如下所示。

strcpy(StoredEdits[numOfEdits],tmp);

当你有一个文件中每行的大小不一样时,最好将指针数组指向字符数组。