Я долго пытался найти решение, но мне кажется, что я не могу.
Я пытался создать программу, которая читает предложения из файла, помещает предложения в виде строк в многомерное массив и быстро сортирует предложения массива в алфавитном порядке. Затем он помещает этот массив в другой массив, который показывает частоту букв в столбце, который показывает букву и частоту.
Например, предложение 7 «CUD» должно быть строкой 7 и иметь 1,1 и 1 в столбцах 3 (c) 4 (d) и 21 (U). Это работает отлично, за исключением последнего предложения, которое по какой-то причине вообще не вводится и показывает случайные числа.
void isAnAnagram(char anagramTester[][MAX_CHAR]) {
int countLetters[MAX_LINES][26] = {0};
int x;
for (int i =1; i <=MAX_LINES; i++) {
for (int j = 0; (anagramTester[i][j] != '\0'); j++) {
if (anagramTester[i][j] >= 'a' && anagramTester[i][j] <= 'z') {
x = anagramTester[i][j] - 'a' +1;
countLetters[i][x]++;
} else if (anagramTester[i][j] >= 'A' && anagramTester[i][j] <= 'Z') {
x = anagramTester[i][j] - 'A' +1;
countLetters[i][x]++;
}
}
}
for(int i=1;i<=MAX_LINES;i++){ //Rows
printf("row:%d ", i);
for(int j=1;j<=26;j++){ //Cols
printf("%d ",countLetters[i][j]);
}
printf("\n");
}}
Это функция, которая принимает двумерный массив со строками в нем, который я пытался изменить циклы, но принципиально я не знаю, почему эта ошибка возникает только в последнем предложении.
здесь есть функция ввода и вывода файла
void readSentences(char inputSentences[][MAX_CHAR]){
int lineNum = 0;
FILE *fp = fopen("YOurDETAILS/input.txt", "r+");
fseek(fp, 0, SEEK_SET);
if(fp== NULL ){
/* check does weather file exist etc*/
perror("Error opening file");
lineNum = -1;
/* use this as a file not found code */
}
else {
// fgets returns NULL when it gets to the end of the file
for(lineNum = 1; lineNum <= MAX_LINES; lineNum++){
if(fgets(inputSentences[lineNum], MAX_CHAR, fp) != NULL){
inputSentences[lineNum][MAX_CHAR] = '\0';
}
else {
inputSentences[lineNum][MAX_CHAR] = '\0';
fclose(fp);
}
inputSentences[MAX_LINES][MAX_CHAR] = '\0';
}
}
}
void writeAnswer(char output[][MAX_CHAR]){
FILE *fp = fopen("YOurDETAILS/output.txt", "w");
fprintf(fp,"Sorted Array:\n");
for (int i =1; i <= MAX_LINES; i++) {
fprintf(fp,"sentence %d:%s \n ", i, output[i]);
}
fclose(fp);
}
содержимое input.txt файл
cat
O, Draconian devil! Oh, lame saint!
tac
Tom Marvolo Riddle
Software engineering
Leonardo da Vinci! The Mona Lisa!
Computer science
CUD
Act
cuddle
Hey there!
Old Immortal dovers
I am Lord Voldemort
duck
файл сортировки
void swap(char sentencesToSwap[][MAX_CHAR], int i, int j){
for(int x = 0;x < MAX_CHAR; x++ ) {
char temp = sentencesToSwap[i][x];
sentencesToSwap[i][x] = sentencesToSwap[j][x];
sentencesToSwap[j][x] = temp;
}
}
void quicksort(char sentencesToSort[][MAX_CHAR], int first, int last){
if(first < last){
char pivotindex = partition(sentencesToSort, first, last);
quicksort(sentencesToSort, first, pivotindex-1);
quicksort(sentencesToSort, pivotindex+1, last);
}
}
int partition(char sentencesToSort[][MAX_CHAR], int first, int last){
swap(sentencesToSort, first, (first + last) / 2);
char *pivot;
pivot = sentencesToSort[first]; // remember pivot
int index1 = first + 1; // index of first unknown value
int index2 = last; // index of last unknown value
while (index1 <= index2) { // while some values still unknown
if (strcasecmp(sentencesToSort[index1],pivot) <= 0)
index1++;
else if (strcasecmp(sentencesToSort[index2],pivot) > 0)
index2--;
else {
swap(sentencesToSort, index1, index2);
index1++;
index2--;
}
}
swap(sentencesToSort, first, index2); // put the pivot value between the two
// sublists and return its index
return index2;
}
Основной файл ниже
char sentences[MAX_LINES][MAX_CHAR];
readSentences(sentences);
isAnAnagram(sentences);
quicksort(sentences, 0, MAX_LINES );
writeAnswer(sentences);