Если str1
указывает на строку "k__hi, s__bye", то st7
указывает на "s__bye".Поэтому, когда вы делаете
if(strcmp(arr[st7[i]], arr[st7[j]]) > 0)
с i
равным 0 и j
равным 1, вы делаете:
if(strcmp(arr[st7[0]], arr[st7[1]]) > 0)
, поскольку st7
указывает на строку "s__bye",это то же самое, что
if(strcmp(arr['s'], arr['_']) > 0)
Использование 's'
и '_'
в качестве индекса массива , а не то, что вы хотите, так как массив определяется как arr[10][10]
, то есть действительный индексот 0 до 9 и 's'
больше 10. Другими словами - ваш доступ находится за пределами массива, и поэтому код имеет неопределенное поведение.
Кроме того, arr
неинициализирован, поэтому вы не сравниваете какие-либодействительные данные.Еще раз это неопределенное поведение.
Так что вам нужно сделать две вещи:
1) Инициализировать массив
2) Исправить индекс так, чтобы он всегда был в диапазоне0..9
Немного неясно, что вы пытаетесь, но я думаю, что вы должны скопировать строку, на которую указывает st7
, в массив, а затем отсортировать массив.Возможно, что-то вроде:
if (st7 != NULL)
{
strcpy(arr[0], st7); // Not sure which index to use here
// So I just used index 0
for (i = 0;i < 10; ++i)
{
for (j = i + 1; j < 10; ++j)
{
if(strcmp(arr[i], arr[j]) > 0) // Only use i and j for indexing
{
strcpy(temp, arr[i]);
strcpy(arr[i], arr[j]);
strcpy(arr[j], temp);
}
}
printf("%s\n", arr[i]); // Moved inside the loop
}
}
Собрать все вместе в примере из 4 слов можно было бы:
#include <stdio.h>
#include <string.h>
#define NUM_WORDS 4
char arr[NUM_WORDS][50];
void add_word(char* str1)
{
char *s1, *st1, *st7;
int i, j;
char temp[50];
s1 = strtok(str1, ";");
do
{
st7 = strstr(s1, "s__");
if (st7 != NULL)
{
strcpy(arr[0], st7 + 3);
for (i = 0;i < NUM_WORDS; ++i)
{
for (j = i+1; j < NUM_WORDS; ++j)
{
if (strcmp(arr[i], arr[j]) > 0)
{
strcpy(temp, arr[i]);
strcpy(arr[i], arr[j]);
strcpy(arr[j], temp);
}
}
}
}
} while (s1 = strtok(NULL, ";"));
}
int main(void) {
for(int i=0; i<10;++i) strcpy(arr[i], "");
char s[] = "s__hello;s__seeyou;s__bye;s__hi";
add_word(s);
for(int i=0; i<10;++i) printf("%s\n", arr[i]);
return 0;
}
Вывод:
bye
hello
hi
seeyou