gpt4 book ai didi

c - qsort() 对一个字符串数组进行排序,但对另一个字符串进行段错误

转载 作者:行者123 更新时间:2023-12-02 00:07:52 25 4
gpt4 key购买 nike

我正在尝试从 .txt 文件中读取一堆名称,并将它们复制到数组中。然后我想使用 qsort() 对数组进行排序。另外,我正在阅读的文件是来自 Project Euler #22 的 names.txt .这是代码:

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

/* create a pointer to point to s */
char *strdup(char *s)
{
char *p;

p = (char *) malloc(strlen(s)+1);
if (p != NULL)
strcpy(p, s);
return p;
}

int compare(const void *a, const void *b)
{
const char *ap = *(const char **) a;
const char *bp = *(const char **) b;
return strcmp(ap, bp);
}

int main(void)
{
FILE *fp;
int c, i, j=0;
char name[100], *names[10000];

fp = fopen("names.txt", "r");
if (fp == NULL) {
printf("can't open file\n");
exit(0);
}

c = fgetc(fp); /* initialize c and skip first quotation mark */

while (c != EOF) { /* loop until no names are left */
i = 0;
while ((c=fgetc(fp)) != '"') /* copy chars to name until " is reached */
name[i++] = c;
name[i] = '\0';
names[j++] = strdup(name);
fgetc(fp); /* skip comma */
c = fgetc(fp);
}

size_t size = sizeof(names[0]);
size_t count = sizeof(names)/size;
qsort((void **) names, count, size, &compare);

return 0;

}

尝试对名称数组进行排序会导致段错误。但是,如果我尝试对显式声明的字符串数组进行排序,则它可以工作:
char *test[] = { "FOO", "BAR", "TEST" };

size_t size = sizeof(test[0]);
size_t count = sizeof(test)/size;
qsort((void **) test, count, size, &compare);

for (i = 0; i < 3; ++i)
printf("%s\n", test[i]);

return 0;

我怀疑段错误是由于我的数组“names”中的错误造成的,但是如果我在尝试对其进行排序之前循环遍历并打印“names”的每个元素,则不会出现问题。

任何帮助深表感谢!

最佳答案

这一行:

size_t count = sizeof(names)/size;

将产生您的 names 的整个长度数组,而不仅仅是您已初始化的值。如果您输入的名称少于 10000 个,那么您将在那里获得一些无效的指针,当您尝试对它们进行排序时 - KABOOM!

您可以使用 j而不是 count ,因为您正在使用它来跟踪输入了多少名称。

关于c - qsort() 对一个字符串数组进行排序,但对另一个字符串进行段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17261447/

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