冒泡排序中的字符数组

时间:2017-08-28 14:16:39

标签: c string char bubble-sort

我编写了以下代码来获取二维字符数组中的排序字符串

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

void swap(char *,char *);

void main() {
    char a[20][20];
    int Pass = 0, i = 0, j = 0, n;

    printf("\nHow many elements you want to sort ? >> ");
    scanf("%d", &n);
    printf("\n\nEnter the elements to be sorted :\n");
    for (i = 0; i < n; i++)
        scanf("%s", a[i]);
    for (Pass = 1; Pass < n; Pass++) {
        for (j = 0; j < n - Pass; j++)
            if (strcmp(a[j], a[j + 1]) < 0)
                swap(a[j], a[j + 1]);
        printf("\n\nPass = %d\n", Pass);
        for (i = 0; i < n; i++)
            printf(" %s  ", a[i]);  
    }   
}

void swap(char *a, char *b) {
    char *t;
    *t = *a;
    *a = *b;
    *b = *t;
}

但是,我输出为

How many elements you want to sort ? >> 5
Enter the elements to be sorted :
1 2 3 4 5
Pass = 1
2   3   4   5   1  
Pass = 2
3   4   5   2   1  
Pass = 3
4   5   3   2   1  
Pass = 4
Segmentation fault (core dumped)

为什么我会遇到分段错误? (如果我使用整数数组而不是字符数组,相同的代码可以正常工作)

3 个答案:

答案 0 :(得分:1)

输入点com.example.dao.ICandidate 定义为

main

或(带参数)

int main()

但可能会或可能不会返回一些价值。

在函数int main(int argc, char* argv[]) 中,您正在访问未初始化的指针,这会导致undefined behavior。没有必要使用指针。使用普通swap

char

另外,为了避免缓冲区溢出,您应该告诉void swap(char *a,char *b) { char t; t=*a; *a=*b; *b=t; } 从输入缓冲区扫描多少个字符

scanf()

并检查扫描是否成功。

现在你应该得到正确的结果。的 Here is fixed code.

答案 1 :(得分:1)

您正在弄乱swap方法中的指针。目前你在做:

void swap(char *a,char *b)
{
    char *t;
    *t=*a;
    *a=*b;
    *b=*t;
}

此行*t = *a似乎是SEGV的极有可能的候选者,因为t是未初始化的字符指针。我通过gdb运行你的代码,gdb也说同样的事情:

Reading symbols from a.out...done.
(gdb) run
Starting program: /home/rohan/Documents/src/a.out 

How many elements you want to sort ? >> 5


Enter the elements to be sorted :
1 2 3 4 5

Program received signal SIGSEGV, Segmentation fault.
0x0000555555554a21 in swap (a=0x7fffffffdce0 "1", b=0x7fffffffdcf4 "2") at testBubble.c:26
26      *t=*a;
(gdb) 

你不需要t作为指针变量。它只是交换所需的临时变量。所以改变你的方法,这就解决了我的情况:

void swap(char *a,char *b)
{
    char t;
    t=*a;
    *a=*b;
    *b=t;
}

答案 2 :(得分:0)

交换功能不正确:您取消引用未初始化的指针t,导致未定义的行为:在您的情况下出现分段错误。

您应该将t定义为char

void swap(char *a, char *b) {
    char t;
    t = *a;
    *a = *b;
    *b = t;
}

但这只适用于单个字符的单词。

要交换最多19个字节的单词,请使用:

void swap(char *a, char *b) {
    char t[20];
    strcpy(t, a);
    strcpy(a, b);
    strcpy(b, t);
}

main函数中添加一些额外的测试和保护,以避免未定义的行为:

int main(void) {
    char a[20][20];
    int Pass = 0, i = 0, j = 0, n;

    printf("\nHow many elements you want to sort ? >> ");
    if (scanf("%d", &n) != 1 || n < 0 || n > 20)
        return 1;
    printf("\n\nEnter the elements to be sorted :\n");
    for (i = 0; i < n; i++) {
        if (scanf("%19s", a[i]) != 1)
            return 1;
    }
    for (Pass = 1; Pass < n; Pass++) {
        for (j = 0; j < n - Pass; j++) {
            if (strcmp(a[j], a[j + 1]) < 0)
                swap(a[j], a[j + 1]);
        }
        printf("\nPass = %d\n", Pass);
        for (i = 0; i < n; i++)
            printf(" %s", a[i]);
        printf("\n"); 
    }
    return 0;  
}