我已经从`
修改了现有代码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编程的新手,请告知:)
答案 0 :(得分:1)
如果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