我已经从`修改了现有代码
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