gpt4 book ai didi

c - 随机排列数组(段错误)

转载 作者:行者123 更新时间:2023-11-30 15:44:08 26 4
gpt4 key购买 nike

所以我应该创建一个函数来完成:目的:打乱文本文件行的程序

  • 将文件读入数组
  • 计算行数和最大长度
  • 计算数组的最大宽度
  • 获取文件指针到开头
  • 为动态字符串数组保留内存
  • 读取一行并存储在分配的内存中
  • 将\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

关于c - 随机排列数组(段错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19624063/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com