Я пытаюсь исправить мою последнюю проблему, и все же я не могу понять, как ее решить. Моя задача состояла в том, чтобы написать программу, которая сортирует номера, но: наш преподаватель дает нам дополнительные баллы для программы, занимающейся цифрами вроде: 000054667 (фактически 54667) и 345_845 (на самом деле 345845). Первая проблема уже решена, но я понятия не имею, как обращаться со вторым. Следовательно, мой вопрос: у вас есть подсказки/подсказки, которые могут мне помочь? Я также посылаю мой код:Номера сортировки (подчеркивание)
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define NUMBER_CHUNK 13
char* getNumber(FILE* fp)
{
int length, c;
int current=0;
char *number;
number=(char*)malloc(sizeof(char)*NUMBER_CHUNK);
if(!number)
{
printf("Error while alocating memory!\n");
return NULL;
}
length=NUMBER_CHUNK;
while(!isspace(c=fgetc(fp)) && !feof(fp))
{
if(isdigit(c))
{
number[current]=c;
current++;
if(current>=length)
{
length+=NUMBER_CHUNK;
if((number=((char*)realloc(number,sizeof(char*)*length)))==NULL)
{
free(number);
return NULL;
}
}
}
else
{
return NULL;
}
}
number[current]='\0';
return number;
}
int compare(const void *str1, const void *str2)
{
int value;
char* curr1;
char* curr2;
curr1=*(char**)str1;
curr2=*(char**)str2;
while(*curr1=='0') curr1++;
while(*curr2=='0') curr2++;
if(strlen(curr1) < strlen(curr2)) return -1;
if(strlen(curr1) > strlen(curr2)) return 1;
value=strcmp(curr1, curr2);
return value;
}
int main(int argc, char** argv)
{
FILE* fp;
char** tab;
int i=0;
int lines=0;
int length=10;
if(argc!=2)
{
printf("Incorrent syntax! Use ./name_of_program input_file\n");
return 1;
}
if(!(fp=fopen(argv[1],"r")))
{
printf("Could not open the file! Please try again!\n");
return 2;
}
tab = (char**)malloc(length*(sizeof(char*)));
if(!tab)
{
printf("Could not allocate memory! Terminating...\n");
free(tab);
return 3;
}
while(!feof(fp))
{
tab[i]=getNumber(fp);
if(i>=length)
{
length+=10;
if((tab=((char**)realloc(tab,sizeof(char*)*length)))==NULL)
{
free(tab);
return 5;
}
}
if(tab[i]==NULL)
{
printf("Incorrect character in the infile! Terminating\n");
free(tab);
return 4;
}
if(*tab[i]=='\0')
{
free(tab[i]);
i--;
}
i++;
lines++;
lines=i;
}
printf("\nBEFORE\n");
for(i=0;i<lines;i++)
{
printf("%s\n",tab[i]);
}
qsort(tab, lines, sizeof(char*), &compare);
printf("\nAFTER\n");
for(i=0;i<lines;i++)
{
printf("%s\n",tab[i]);
free(tab[i]);
}
free(tab);
fclose(fp);
return 0;
}
Спасибо за любую помощь;)
Когда вы читаете каждый символ из файла, вы можете перейти к следующему символу, когда вы сталкиваетесь то, что не 'isdigit' вместо прерывания. – DCoder
, где проблема? Вам просто нужно сделать некоторую начальную работу над вашими номерами, прежде чем вызывать свой код. Я думаю, что довольно легко удалить «_» из чисел и обработать цифры, начиная с нуля. – Algorithmist
@ Алгоритмист небольшое недоразумение, я не хочу удалять подчеркивание, я хочу, чтобы моя программа каким-то образом опустила символ подчеркивания и после сортировки отобразила номер таким образом 34_234. – all0star