所以我应该创建一个可以完成的功能:
目的:改组文本文件各行的程序


将文件读入数组
计算行数和最大长度
计算数组的最大宽度
获取文件开头的指针
为动态字符串数组保留内存
读取一行并存储在分配的内存中
将\ n变成\ 0
打印数组中的行(测试)
随机排列
打印数组中的行(测试)
可用内存和关闭文件


(只是给一些背景)

但是,当我打印混洗后的数组时,会遇到分段错误。有时,它会打印一个或两个字符串,但是有时它只显示“ Shuffled Array”,然后出现分段错误。有任何想法吗?

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

// Accepts: command line input
// Returns: 0 if no error

int main(int argc, char *argv[] ){
    int x = 0, i, lineCount = 0, maxLen = 0;
    char line[500], temp;
    FILE *file = fopen( argv[1], "r" );
//  check if file exists
    if (file == NULL){
        printf("Cannot open file\n");
        return 1;
    }
//  Gets lines, max length of string
    while (fgets(line, sizeof(line), file) != NULL){
        lineCount++;
        if (strlen(line) > maxLen)
            maxLen = strlen(line);
    }
    rewind(file);
    char *lineArray[lineCount];
    while (fgets(line, sizeof(line), file) != NULL) {
            lineArray[x] = malloc(strlen(line));
        if (lineArray[x] == NULL){
            printf("A memory error occurred.\n");
            return(1);
        }
            strcpy(lineArray[x], line);
//  change \n to \0
        lineArray[x][strlen(lineArray[x])-1] = '\0';
        x++;
    }
    printf("File %s has %d lines with maximum length of %d characters\n",
        argv[1], lineCount, maxLen);
    printf("Original Array\n");
    for (x = 0; x < lineCount; x++)
        printf("%2d %s\n", x, lineArray[x]);
//  Shuffle array
    srand( (unsigned int) time(NULL));
    for (x = lineCount - 1; x >= 0; x--){
        i = (int) rand() % lineCount;
        temp = lineArray[x];
        lineArray[x] = lineArray[i];
        lineArray[i] = temp;
    }
    printf("\nShuffled Array\n");
    for (x = 0; x < lineCount; x++)
        printf("%2d %s\n", x, lineArray[x]);
//  free allocated memory
    for (x = 0; x < lineCount; x++)
        free(lineArray[x]);
    free(lineArray);
    fclose(file);
    return 0;
}

最佳答案

在我的计算机上运行cc的输出使错误非常明显。

$ cc tmp.c -o tmp
tmp.c:46:14: warning: incompatible pointer to integer conversion assigning to
      'char' from 'char *'; dereference with * [-Wint-conversion]
        temp = lineArray[x];
             ^ ~~~~~~~~~~~~
               *
tmp.c:48:22: warning: incompatible integer to pointer conversion assigning to
      'char *' from 'char'; take the address with & [-Wint-conversion]
        lineArray[i] = temp;
                     ^ ~~~~
                       &
2 warnings generated.


您需要修复变量,不能在打算使用char的地方使用char *

抱歉,请更清楚地说:

char line[500], temp;


应该:

 char line[500], *temp;


如果您想弄清这是为什么,请告诉我。

最后,在方法的顶部声明变量不是C风格的(除非您正在编写嵌入式C)。声明它们尽可能靠近使用点。它使查找声明更加容易。例如,temp可以在循环本身的上方或什至更好地在循环本身的上方声明。

哦,还有:

$ cc --version
Apple LLVM version 5.0 (clang-500.2.76) (based on LLVM 3.3svn)
Target: x86_64-apple-darwin13.0.0
Thread model: posix

10-06 09:12