我编写了以下代码来获取二维字符数组中的排序字符串
#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)
为什么我会遇到分段错误? (如果我使用整数数组而不是字符数组,相同的代码可以正常工作)
答案 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;
}