У меня есть проект, в котором мне нужно отсортировать несколько строк текста на основе второго, третьего и т. Д. Слова в каждой строке, а не первого слова.Например,
this line is first
but this line is second
finally there is this line
и вы выберете сортировку по второму слову, оно превратится в
this line is first
finally there is this line
but this line is second
(так как строка предшествует тому, что перед этим)
У меня есть указатель на массив символов, который содержит каждую строку.До сих пор я использовал strtok (), чтобы разбить каждую строку до второго слова, но при этом вся строка заменяется только на это слово и сохраняется в моем массиве.Мой код для бит токенизации выглядит следующим образом:
for (i = 0; i < numLines; i++) {
char* token = strtok(labels[i], " ");
token = strtok(NULL, " ");
labels[i] = token;
}
Это даст мне второе слово в каждой строке, так как я дважды вызывал strtok.Затем я сортирую эти слова.(строка, это, там) Тем не менее, мне нужно собрать строку обратно в ее первоначальном виде.Я знаю, что strtok превращает токены в '\ 0', но я все еще не нашел способ вернуть исходную строку.
Я уверен, что ответ заключается в использовании указателей, но яперепутал, что именно мне нужно делать дальше.
Я должен упомянуть, что я читаю строки из входного файла, как показано:
for (i = 0; i < numLines && fgets(buffer, sizeof(buffer), fp) != 0; i++) {
labels[i] = strdup(buffer);
Редактировать: мой метод find_offset
size_t find_offset(const char *s, int n) {
size_t len;
while (n > 0) {
len = strspn(s, " ");
s += len;
}
return len;
}
Редактировать 2: соответствующий код, используемый для сортировки
//Getting the line and offset
for (i = 0; i < numLines && fgets(buffer, sizeof(buffer), fp) != 0; i++) {
labels[i].line = strdup(buffer);
labels[i].offset = find_offset(labels[i].line, nth);
}
int n = sizeof(labels) / sizeof(labels[0]);
qsort(labels, n, sizeof(*labels), myCompare);
for (i = 0; i < numLines; i++)
printf("%d: %s", i, labels[i].line); //Print the sorted lines
int myCompare(const void* a, const void* b) { //Compare function
xline *xlineA = (xline *)a;
xline *xlineB = (xline *)b;
return strcmp(xlineA->line + xlineA->offset, xlineB->line + xlineB->offset);
}