C中的字符串排序
Sorting string in C
好吧,我正在尝试从 C 文件中按字母顺序对字符串进行排序,但我的程序无法运行。我认为动态数组的内存分配有误,但我找不到。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define buflen 42
int comp(const void * a, const void * b) {
const char *arraya = *(const char**)a;
const char *arrayb = *(const char**)b;
return strcmp(arraya, arrayb);
}
char* getarray(FILE *input)
{
char buffer[buflen];
char* result = NULL;
size_t chargot = 0;
size_t fact = 0;
size_t wasinarray = 0;
while (fgets(buffer, buflen, input))
{
chargot = strlen(buffer);
fact += chargot;
if (fact >= wasinarray)
{
wasinarray += buflen;
result = realloc(result, wasinarray);
strcat(result, buffer);
}
if (buffer[chargot - 1] == '\n')
break;
}
if (ferror(stdin))
{
if (result)
free(result);
return NULL;
}
return result;
}
int main() {
char **strarray = NULL;
int i = 1, strcount = 0;
char* strline;
FILE *input, *output;
input = fopen("input.txt", "r");
output = fopen("output.txt", "w");
strarray = (char**)malloc(i * sizeof(char*));
while (strline = getarray(input) != NULL)
{
strarray[strcount] = strline;
strarray = (char**)realloc(strarray, (i + 1) * sizeof(char*));
strcount++;
i++;
}
qsort(strarray, strcount, sizeof(char**), comp);
for (i = 0; i < strcount; i++)
{
fprintf(output, "%s", strarray[i]);
free(strarray[i]);
}
free(strarray);
free(strline);
close(output);
close(input);
return 0;
}
输入输出必须是这样
输入:
dfsdfds
asfsdfds
badgfdgfd
csdfdsgfd
输出:
asfsdfds
badgfdgfd
csdfdsgfd
dfsdfds
像这样修复:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define buflen 42
int comp(const void * a, const void * b) {
return strcmp(*(const char**)a, *(const char**)b);
}
char* getarray(FILE *input){
char buffer[buflen];
char* result = NULL;
size_t chargot = 0;
size_t fact = 0;
while (fgets(buffer, buflen, input)){
chargot = strlen(buffer);
result = realloc(result, fact + chargot + 1);
memcpy(result + fact, buffer, chargot + 1);
fact += chargot;
if (buffer[chargot - 1] == '\n')
return result;
}
return NULL;
}
int main(void){
char **strarray = NULL;
int i = 0, strcount = 0;
char* strline;
FILE *input, *output;
input = fopen("input.txt", "r");
output = fopen("output.txt", "w");
while ((strline = getarray(input)) != NULL){
strarray = realloc(strarray, (i + 1) * sizeof(char*));
strarray[i++] = strline;
}
qsort(strarray, (strcount=i), sizeof(char*), comp);
for (i = 0; i < strcount; i++){
fprintf(output, "%s", strarray[i]);//!!Input line includes always newline
free(strarray[i]);
}
free(strarray);
fclose(output);
fclose(input);
return 0;
}
好吧,我正在尝试从 C 文件中按字母顺序对字符串进行排序,但我的程序无法运行。我认为动态数组的内存分配有误,但我找不到。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define buflen 42
int comp(const void * a, const void * b) {
const char *arraya = *(const char**)a;
const char *arrayb = *(const char**)b;
return strcmp(arraya, arrayb);
}
char* getarray(FILE *input)
{
char buffer[buflen];
char* result = NULL;
size_t chargot = 0;
size_t fact = 0;
size_t wasinarray = 0;
while (fgets(buffer, buflen, input))
{
chargot = strlen(buffer);
fact += chargot;
if (fact >= wasinarray)
{
wasinarray += buflen;
result = realloc(result, wasinarray);
strcat(result, buffer);
}
if (buffer[chargot - 1] == '\n')
break;
}
if (ferror(stdin))
{
if (result)
free(result);
return NULL;
}
return result;
}
int main() {
char **strarray = NULL;
int i = 1, strcount = 0;
char* strline;
FILE *input, *output;
input = fopen("input.txt", "r");
output = fopen("output.txt", "w");
strarray = (char**)malloc(i * sizeof(char*));
while (strline = getarray(input) != NULL)
{
strarray[strcount] = strline;
strarray = (char**)realloc(strarray, (i + 1) * sizeof(char*));
strcount++;
i++;
}
qsort(strarray, strcount, sizeof(char**), comp);
for (i = 0; i < strcount; i++)
{
fprintf(output, "%s", strarray[i]);
free(strarray[i]);
}
free(strarray);
free(strline);
close(output);
close(input);
return 0;
}
输入输出必须是这样
输入:
dfsdfds
asfsdfds
badgfdgfd
csdfdsgfd
输出:
asfsdfds
badgfdgfd
csdfdsgfd
dfsdfds
像这样修复:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define buflen 42
int comp(const void * a, const void * b) {
return strcmp(*(const char**)a, *(const char**)b);
}
char* getarray(FILE *input){
char buffer[buflen];
char* result = NULL;
size_t chargot = 0;
size_t fact = 0;
while (fgets(buffer, buflen, input)){
chargot = strlen(buffer);
result = realloc(result, fact + chargot + 1);
memcpy(result + fact, buffer, chargot + 1);
fact += chargot;
if (buffer[chargot - 1] == '\n')
return result;
}
return NULL;
}
int main(void){
char **strarray = NULL;
int i = 0, strcount = 0;
char* strline;
FILE *input, *output;
input = fopen("input.txt", "r");
output = fopen("output.txt", "w");
while ((strline = getarray(input)) != NULL){
strarray = realloc(strarray, (i + 1) * sizeof(char*));
strarray[i++] = strline;
}
qsort(strarray, (strcount=i), sizeof(char*), comp);
for (i = 0; i < strcount; i++){
fprintf(output, "%s", strarray[i]);//!!Input line includes always newline
free(strarray[i]);
}
free(strarray);
fclose(output);
fclose(input);
return 0;
}