读取现有文件以处理c

时间:2018-12-29 07:29:22

标签: c dictionary

我已经从`

修改了现有代码
  

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编程的新手,请告知:)

1 个答案:

答案 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