- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我从文件读取字符作为整数并将它们转换为数组中的字符串后,尝试在mergesort算法中比较字符串。我能够打印出字符串,但是当char[]
数组传递给mergesort算法时,程序在合并排序的strcmp()
步骤中的merge()
步骤崩溃。
我测试发现临时的char[]
数组未正确初始化,所以我认为问题是我没有将原始的char[]
数组“ charr”传递给mergsort
函数。
我不知道该怎么做。我从网上借用了mergesort算法,该算法适用于int
数组,但是将int[]
数组更改为char[]
数组的简单更改不起作用。
如何获得要进行排序的char[]
数组正确传递并在mergesort
函数中初始化?
文本文件中的排列如下所示:
aa
阿阿巴
阿巴阿
阿巴阿
巴阿
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main(void) {
int arr[243][6];
//This is the array that I want to store my strings
char *charr[243][6];
int c, i = 0 , j = 0;
FILE *file;
file = fopen("permutations.txt", "r");
if (file) {
while ((c = getc(file)) != EOF) {
// we are reading each char in the string
//every time we hit a new line char (\n = 10)
//advance the array one, otherwise add the
// char
if (c != 10) {
arr[i][j] = c;
j++;
}
else {
arr[i][j] = c;
sprintf(charr[i], "%d%d%d%d%d%d", arr[i][0], arr[i][1],
arr[i][2], arr[i][3], arr[i][4]);
i++;
j = 0;
}
}
fclose(file);
}
if (strcmp(charr[0],charr[1]) < 0)
printf("less\n");
else
printf("other\n");
r_mergesort(charr,0,242);
for (int k = 0; k < 243; k++) {
printf(charr[k]);
for (int l = 0; l < 6; l++) {
putchar(arr[k][l]);
}
}
return 0;
}
/*l is for left index and r is right index of the sub-array*/
void r_mergesort (char arr[], int l, int r) {
//base case
if (l < r) {
//divide
int m = (l + r) /2;
// recursively sort halves
r_mergesort(arr, l, m);
r_mergesort(arr, m + 1, r);
// merge results
merge(arr, l, m, r);
}
}
void merge (char arr[], int l, int m, int r) {
int i, j, k;
int n1 = m - l + 1;
int n2 = r - m;
// create temp arrays
char left[n1], right[n2];
// copy data to temp arrays
for (i = 0; i < n1; i++) {
left[i] = arr[l + i];
}
for (j = 0; j < n2; j++)
right[j] = arr[m + 1 + j];
// merge the temp arrays back into arr[]
i = 0;
j = 0;
k = l;
while (i < n1 && j < n2) {
if (strcmp(left[i], right[j]) < 0) {
arr[k] = left[i];
i++;
}
else {
arr[k] = right[j];
j++;
}
k++;
}
//copy the remaining elements of left[]
while (i < n1) {
arr[k] = left[i];
i++;
k++;
}
//copy the remaining elements of right[]
while (i < n2) {
arr[k] = right[j];
j++;
k++;
}
}
最佳答案
如果像您描述的那样,面向字符的输入(例如getc
)没有问题,例如您的permutations.txt
包含每行一个可能的排列,那么使用面向行的输入将简化您的读取(我怀疑这是在哪里您的大部分问题都在于此)。因此,让我们正确阅读数据文件,作为解决问题的开始。
使用面向行的输入,您的主要功能是fgets
和getline
。每个都有一些优点和缺点。由于您专门处理静态声明,因此我们在下面的示例中使用fgets
。
对于面向行的输入,要注意的一件事是,fgets
会一直读取,直到遇到newline
('\n'
)或指定的最大字符数(负1留给nul终止符)为止。在您的情况下,这意味着,如果您声明了charr[243][7]
并且每行具有6
个字符(加上'\n'
总共为7
个字符),那么如果您不增加自己的字符数就会遇到问题字符串大小加上一个附加字符,以允许'\n'
作为每一行的一部分被读取(并为nul-terminator提供空间)。
基本上将要发生的是,您将告诉fgets
最多读取7
个字符,这意味着它将读取您所有的排列字符6
,但在行末的'\n'
未被读取。您对fgets
的下一次调用将仅读取'\n'
。要解决整个问题,只需声明charr[243][8] = {{0}};
即可完整读取每一行。
您可能会说,“这听起来并不简单”-是的,我只是想确保并给出详尽的解释,以免您最终陷入阅读不到一整行的微妙问题中。当然,由于所有面向行的输入函数都读取并包含'\n'
作为其读取的一部分,因此您将需要从存储在数组中的字符串中删除换行符。在解释之后,希望该示例可使阅读的内容更加清楚:
#include <stdio.h>
#include <string.h>
#define MAXR 243
#define MAXC 8
int main (int argc, char **argv) {
char charr[MAXR][MAXC] = {{0}};
FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;
size_t i = 0;
if (!fp) {
fprintf (stderr, "error: file open failed '%s'\n", argv[1]);
return 1;
}
while (i < MAXR && fgets (charr[i], MAXC, fp))
{
/* get length, strip trailing newline */
size_t len = strlen (charr[i]);
if (charr[i][len-1] == '\n') charr[i][len-1] = 0;
printf (" charr[%zu] : %s\n", i, charr[i]);
i++;
}
if (fp != stdin) fclose (fp);
return 0;
}
stdin
)读取的每个排列。仅仅是为了确认您对permutations.txt文件的读取。
gcc -Wall -Wextra -O3 -o bin/readperm readperm.c
$ cat permutations.txt
123456
234561
345612
456123
$ ./bin/readperm permutations.txt
charr[0] : 123456
charr[1] : 234561
charr[2] : 345612
charr[3] : 456123
fgets
和
getline
是用于行输入的主要工具,但我很少建议使用
scanf
函数系列,但如果您的permutations.txt文件与您描述的完全相同,则在以下情况下可以非常有效地使用
fscanf
这个案例。通常,选择格式字符串和适当的格式说明符可以使新C程序员适应。由于
fscanf
不需要阅读换行符,因此可以使用
char charr[243][7] = {{0}};
声明,而不必担心删除包含的
newline
。具体来说,您可以将上面的read循环替换为:
while (i < MAXR && fscanf (fp, " %[^\n]%*c", charr[i]) == 1)
{
printf (" charr[%zu] : %s\n", i, charr[i]);
i++;
}
" %[^\n]%*c"
的选择。开头
space
和
"
之间的前导
'%'
将跳过第一个字符之前的任何空格。用作格式说明符
%[^\n]
的字符大小写表达式将读取直到但不包含
newline
的所有字符。分配抑制
%*c
将读取并丢弃
'\n'
,而不会将其包括在字符串(或
fscanf
返回的匹配计数)中。
" %s"
格式说明符并完成您的情况下的相同读取,但这将消除对格式字符串各部分的解释,这对于理解正确使用
scanf
系列至关重要功能。
== 1
的用法。
fscanf
返回成功的转换次数(根据格式说明符)。因此,只要
fscanf
每次被转换为字符串时,您都希望继续读取。当它无法进行正确的转换时,您的读取循环会终止(您可以将return分配给变量,并在循环体内进行检查以确认
EOF
与读取错误)
关于c - C-如何将char数组传递给函数进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34489137/
Github:https://github.com/jjvang/PassIntentDemo 我一直在关注有关按 Intent 传递对象的教程:https://www.javacodegeeks.c
我有一个 View ,其中包含自动生成的 text 类型的 input 框。当我单击“通过电子邮件发送结果”按钮时,代码会将您带到 CalculatedResults Controller 中的 Em
我有一个基本的docker镜像,我将以此为基础构建自己的镜像。我没有基础镜像的Dockerfile。 基本上,基本镜像使用两个--env arg,一个接受其许可证,一个选择在容器中激活哪个框架。我可以
假设我想计算 2^n 的总和,n 范围从 0 到 100。我可以编写以下内容: seq { 0 .. 100 } |> Seq.sumBy ((**) 2I) 但是,这与 (*) 或其他运算符/函数不
我有这个网址: http://www.example.com/get_url.php?ID=100&Link=http://www.test.com/page.php?l=1&m=7 当我打印 $_G
我想将 window.URL.createObjectURL(file) 创建的地址传递给 dancer.js 但我得到 GET blob:http%3A//localhost/b847c5cd-aa
我想知道如何将 typedef 传递给函数。例如: typedef int box[3][3]; box empty, *board[3][3]; 我如何将 board 传递给函数?我
我正在将一些代码从我的 Controller 移动到核心数据应用程序中的模型。 我编写了一个方法,该方法为我定期发出的特定获取请求返回 NSManagedObjectID。 + (NSManagedO
为什么我不能将类型化数组传递到采用 any[] 的函数/构造函数中? typedArray = new MyType[ ... ]; items = new ko.observableArray(ty
我是一名新的 Web 开发人员,正在学习 html5 和 javascript。 我有一个带有“选项卡”的网页,可以使网页的某些部分消失并重新出现。 链接如下: HOME 和 JavaScript 函
我试图将对函数的引用作为参数传递 很难解释 我会写一些伪代码示例 (calling function) function(hello()); function(pass) { if this =
我在尝试调用我正在创建的 C# 项目中的函数时遇到以下错误: System.Runtime.InteropServices.COMException: Operation is not allowed
使用 ksh。尝试重用当前脚本而不修改它,基本上可以归结为如下内容: `expr 5 $1 $2` 如何将乘法命令 (*) 作为参数 $1 传递? 我首先尝试使用“*”,甚至是\*,但没有用。我尝试
我一直在研究“Play for Java”这本书,这本书非常棒。我对 Java 还是很陌生,但我一直在关注这些示例,我有点卡在第 3 章上了。可以在此处找到代码:Play for Java on Gi
我知道 Javascript 中的对象是通过引用复制/传递的。但是函数呢? 当我跳到一些令人困惑的地方时,我正在尝试这段代码。这是代码片段: x = function() { console.log(
我希望能够像这样传递参数: fn(a>=b) or fn(a!=b) 我在 DjangoORM 和 SQLAlchemy 中看到了这种行为,但我不知道如何实现它。 最佳答案 ORM 使用 specia
在我的 Angular 项目中,我最近将 rxjs 升级到版本 6。现在,来自 npm 的模块(在 node_modules 文件夹内)由于一些破坏性更改而失败(旧的进口不再有效)。我为我的代码调整了
这个问题在这里已经有了答案: The issue of * in Command line argument (6 个答案) 关闭 3 年前。 我正在编写一个关于反向波兰表示法的 C 程序,它通过命
$(document).ready(function() { function GetDeals() { alert($(this).attr("id")); } $('.filter
下面是一个例子: 复制代码 代码如下: use strict; #这里是两个数组 my @i =('1','2','3'); my @j =('a','b','c'); &n
我是一名优秀的程序员,十分优秀!