c字符串升序函数输出不可用,Visual Studio 2022

7hiiyaii  于 2023-04-19  发布在  其他
关注(0)|答案(1)|浏览(151)

**c字符串升序函数输出不可用。Visual Studio 2022。

第14行错误1:出现异常(0x00007FF8449F63D4(ucrtbased.dll),hardwork.exe):0xC0000005:写入位置0x00007FF6738F9CA4时发生访问冲突。**

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void SortString(char** aList, int index) {
    int i = 0;
    int j = 0;
    char ntemp[256];
    for (i = 0; i < index - 1; ++i) {
        for (j = i + 1; j < index; ++j) {
            if (strncmp(aList[i], aList[j], sizeof(ntemp)) > 0) {
                strcpy_s(ntemp, sizeof(ntemp), aList[i]);
                strcpy_s(aList[i], sizeof(ntemp), aList[j]);
                strcpy_s(aList[j], sizeof(ntemp), ntemp);
            }
        }
    }
}

int main() {
    char* aList[5] = {
        "abc",
        "def",
        "ab",
        "bcd",
        "ae"
    };
    int i = 0;
    SortString(aList, 5);
    for (i = 0; i < 5; ++i) {
        printf("%s\n", aList[i]);
    }
    return 0;
}
yeotifhr

yeotifhr1#

在这里,您尝试更改指针指向的字符串字面量:

strcpy_s(aList[i], sizeof(ntemp), aList[j]);
strcpy_s(aList[j], sizeof(ntemp), ntemp);

这是不允许的,而且,字符串的长度是不一样的,所以如果你试图复制bcdae,它会写越界。
相反,交换 * 指针 *:

void SortString(char** aList, unsigned index) {
    for (unsigned i = 0; i + 1 < index; ++i) {
        for (unsigned j = i + 1; j < index; ++j) {
            if (strcmp(aList[i], aList[j]) > 0) {
                // swap the pointers:
                char *ntemp = aList[i];
                aList[i] = aList[j];
                aList[j] = ntemp;
            }
        }
    }
}

由于不允许覆盖字符串文字,因此可以将aList改为const char*的数组:

const char* aList[5]

并相应地调整SortString函数。如果您尝试将strcpy_s转换为这样的字符串文字,则会导致编译错误-这比获得运行时错误更好。
Demo

相关问题