Чтение существующего файла для обработки данных в c - PullRequest
0 голосов
/ 29 декабря 2018

Я изменил существующий код из `

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 голосов
/ 29 декабря 2018

Если 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...