我已经从`修改了现有代码


  https://www.programiz.com/c-programming/examples/lexicographical-order


进行修改以从现有的指向数组的指针中读取。但是,我一直在获得信号输出。 https://i.stack.imgur.com/iqWBb.jpg

    char *s1, *st1;
    int i, j;
    char arr[10][10], temp[50];

        s1 = strtok(str1, ";");
        do
        {
            st7 = strstr(s1, "s__");
            if (st7 != NULL)
            {
                for (i = 0;i < 10; ++i)
                {
                    for (j = i + 1; st7[j] < 10; ++j)
                    {
                        if(strcmp(arr[st7[i]], arr[st7[j]]) > 0)
                        {
                            strcpy(temp, arr[st7[i]]);
                            strcpy(arr[st7[i]], arr[st7[j]]);
                            strcpy(arr[st7[j]], temp);
                        }
                    }
                }
                printf("%s\n", arr[i]);
            }
        } while (s1 = strtok(NULL, ";"));


s1:分隔字符串

st7:从字符串中选择子字符串(主要结果)

str1:通过主文件的子字符串初始化(我使用fopen)。结果包含以以下名称开头的名称:k__hi,s__bye

进行了修改,以按字典顺序组织字符串,同时从st7 [从字符串(s1)中选择子字符串]获取字符串。

请告知,因为我是C编程的新手:)

最佳答案

如果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

08-25 11:34