Почему 2 не меньше 10 на кодовых блоках? - PullRequest
1 голос
/ 25 мая 2019

Я просто работал на свой выпускной экзамен с простыми кодами; когда я пытаюсь сортировать строки, я сталкиваюсь с досадной ошибкой. Почему 2 не меньше 10 в моей IDE CodeBlocks, но меньше 10 в реальном и onlinegdb.com?

Это раздражающий код:

#include <string.h>
#include <stdio.h>
#define STR_SIZ 20

int main()
{
    char strArr[][STR_SIZ] = {"abc", "hdas", "sdfasf", "kakldf", "caksl", "casd", "keam", "cznjcx", "mnxzv", "jkalkds"};
    char minStr[STR_SIZ];
    strcpy(minStr, strArr[0]);
    int N = sizeof(strArr)/sizeof(minStr);
   // int N = 10;
    for(int x = 0; x < N-1; x++)
    {
        printf("%d", x);
        strcpy(minStr,strArr[x]);
        int j;
        for(j=1+x; j < 10; j++)
        {
            printf("%4d\n", j);
            int cmp = strcmp(strArr[j], minStr);
            if(cmp < 0)
                strcpy(minStr,strArr[j]);
        }
        char temp[STR_SIZ];
        strcpy(temp,strArr[x]);
        strcpy(strArr[x], minStr);
        strcpy(strArr[j], temp);
    }


    return 0;
}

Вывод на onlinegdb.com:

0   1
   2
   3
   4
   5
   6
   7
   8
   9
1   2
   3
   4
   5
   6
   7
   8
   9
2   3
   4
   5
   6
   7
   8
   9
3   4
   5
   6
   7
   8
   9
4   5
   6
   7
   8
   9
5   6
   7
   8
   9
6   7
   8
   9
7   8
   9
8   9

Вывод на CodeBlocks:

0   1
   2
   3
   4
   5
   6
   7
   8
   9
1   2
   3
   4
   5
   6
   7
   8
   9
2

PS: Я только что использовал Codeblock утром, и все было в порядке с выполнением.

Ответы [ 2 ]

4 голосов
/ 25 мая 2019

strArr имеет 10 элементов. В конце вашего цикла вы звоните strcpy(strArr[j], temp);. Это запишет в strArr[10], что выходит за пределы и перезапишет некоторую неизвестную память. После этого может произойти все, что угодно.

Вы должны сохранить значение j при копировании строки в minStr.

0 голосов
/ 25 мая 2019

FYI, ваш код выше печатает это как ваш последний строковый порядок с onlinegdb:

abc                                                                                                                                                                                  
caksl                                                                                                                                                                                
caksl                                                                                                                                                                                
caksl                                                                                                                                                                                
caksl                                                                                                                                                                                
casd                                                                                                                                                                                 
cznjcx                                                                                                                                                                               
cznjcx                                                                                                                                                                               
jkalkds                                                                                                                                                                              
jkalkds   

Так что я думаю, что у тебя есть и другие проблемы.

попробуйте это

#include <string.h>
#include <stdio.h>
#define STR_SIZ 20

int main()
{
    char strArr[][STR_SIZ] = {"abc", "hdas", "sdfasf", "kakldf", "caksl", "casd", "keam", "cznjcx", "mnxzv", "jkalkds"};
    strcpy(minStr, strArr[0]);

    // Calculate the number of elements this way.
    const int N = sizeof(strArr)/sizeof(strArr[0]);

    // int N = 10;
    for(int x = 0; x < N-1; x++)
    {
        printf("%d", x);
        int j;
        for(j=1+x; j < N; j++)  // Use N here too!
        {
            printf("%4d\n", j);
            int cmp = strcmp(strArr[j], strArr[x]);
            if(cmp < 0)
            {
                // Do the swaps only when needed.
                char temp[STR_SIZ];
                strcpy(temp,strArr[x]);
                strcpy(strArr[x], strArr[j]);
                strcpy(strArr[j], temp);
            }
        }
    }
    // Verify result
    for(int x = 0; x < N; x++) printf("%s\n", strArr[x]);

    return 0;
}

Я перенес твой своп в твой if и избавился от твоего minStr, так как он не был нужен. Обратите внимание, как я рассчитываю размер N тоже. Честно говоря, вы были близки, но вам нужно было проверить свои результаты.

...