冒泡排序中的字符数组
character array in 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)
为什么会遇到segmentation fault? (如果我使用整数数组而不是字符数组,相同的代码可以正常工作)
入口点main
应该定义为
int main()
或(带参数)
int main(int argc, char* argv[])
但可能会或可能不会 return 一些值。
在函数 swap
中,您正在访问导致 undefined behavior 的未初始化指针。不需要使用指针。使用普通 char
.
void swap(char *a,char *b)
{
char t;
t=*a;
*a=*b;
*b=t;
}
同样为了避免缓冲区溢出,你应该告诉scanf()
要从输入缓冲区扫描多少个字符
scanf("%19s",a[i]);
并检查扫描是否成功。
现在你应该得到正确的结果。 Here is fixed code.
您弄乱了 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;
}
交换函数不正确:您取消引用未初始化的指针 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;
}
我编写了以下代码来获取二维字符数组中的排序字符串
#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)
为什么会遇到segmentation fault? (如果我使用整数数组而不是字符数组,相同的代码可以正常工作)
入口点main
应该定义为
int main()
或(带参数)
int main(int argc, char* argv[])
但可能会或可能不会 return 一些值。
在函数 swap
中,您正在访问导致 undefined behavior 的未初始化指针。不需要使用指针。使用普通 char
.
void swap(char *a,char *b)
{
char t;
t=*a;
*a=*b;
*b=t;
}
同样为了避免缓冲区溢出,你应该告诉scanf()
要从输入缓冲区扫描多少个字符
scanf("%19s",a[i]);
并检查扫描是否成功。
现在你应该得到正确的结果。 Here is fixed code.
您弄乱了 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;
}
交换函数不正确:您取消引用未初始化的指针 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;
}