C 错误分段故障(堆芯转储)

C 错误分段故障(堆芯转储),c,c-strings,strcpy,C,C Strings,Strcpy,我正在为我的大学课程做一些关于C的练习,我有以下代码,在用户输入选项(1或2)后,该代码以错误分段错误(内核转储)的形式存在。 我不知道这是否是一个问题,我正在使用ubuntu 16.04,并且我正在使用make命令编译我的源代码文件。 哦,请不要建议使用内置的c函数strcpy,因为这个练习应该“教我们”如何制作自己的字符串副本 那么我做错了什么 #include <stdio.h> #define SIZE 1000 char mystrcpy(char *dest,char

我正在为我的大学课程做一些关于C的练习,我有以下代码,在用户输入选项(1或2)后,该代码以错误分段错误(内核转储)的形式存在。 我不知道这是否是一个问题,我正在使用ubuntu 16.04,并且我正在使用make命令编译我的源代码文件。 哦,请不要建议使用内置的c函数strcpy,因为这个练习应该“教我们”如何制作自己的字符串副本

那么我做错了什么

#include <stdio.h>
#define SIZE 1000

char mystrcpy(char *dest,char *src);

main(){

    char str1[SIZE];
    char str2[SIZE];
    char str3[SIZE];
    int choice;



    printf("Give first string: ");
    gets(str1);
    printf("Give second string: ");
    gets(str2);
    printf("Choose one of two strings (1 h 2): ");
    scanf("%d",&choice);

    if (choice==1)
        mystrcpy(str3,str1);
    else (choice==2)
        mystrcpy(str3,str2);

    printf("\nFirst string is %s\n",str1);
    printf("\Second string is %s\n",str2);
    printf("\nThrid string is %s\n",str3);

}


char mystrcpy(char *dest,char *src){
    int i;

    while(1)
    {

        dest[i] = src[i];
        if (src[i] == '\0')
            break;

        i++;
    }

    return dest;
}
#包括
#定义大小1000
char mystrcpy(char*dest,char*src);
main(){
字符str1[大小];
字符str2[大小];
字符str3[大小];
智力选择;
printf(“给出第一个字符串:”);
获取(str1);
printf(“给出第二个字符串:”);
获取(str2);
printf(“从两个字符串中选择一个(1 h 2):”;
scanf(“%d”,选择(&C);
如果(选项==1)
mystrcpy(str3,str1);
其他(选项==2)
mystrcpy(str3,str2);
printf(“\n第一个字符串是%s\n”,str1);
printf(“\第二个字符串是%s\n”,str2);
printf(“\n字符串为%s\n”,str3);
}
char mystrcpy(char*dest,char*src){
int i;
而(1)
{
dest[i]=src[i];
如果(src[i]='\0')
打破
i++;
}
返回目的地;
}

i
从未初始化过。(需要30个字符)

i
从未初始化过。(需要30个字符)

您没有初始化
i
,因此它从一个不确定的值开始,因此出现segfault


请注意,在这种简单的情况下,启用警告会立即显示此问题;在更复杂的情况下,使用调试器会显示崩溃时
i
的值完全没有意义。

您没有初始化
i
,因此它从一个不确定的值h开始这是一个断层


请注意,在这种简单的情况下,启用警告会立即显示此问题;在更复杂的情况下,使用调试器会显示崩溃时
i
的值完全没有意义。

使用所有警告和调试信息编译(
gcc-Wall-Wextra-g
)。改进您的代码以不获取任何警告。然后使用调试器(
gdb
)^^^^^^巴兹尔说的话。这也会给您一个警告,说明
else(choice==2)
没有任何意义。(尽管这不是SEGD故障的原因。)谢谢!就是这样!我在看教程的一部分。这个家伙从来没有初始化过我…仍然在他身上工作!干什么!再次感谢!这说明了教程的质量…远离它!使用所有警告和调试信息(
gcc-Wall-Wextra-g
)编译。改进代码以不获得警告。然后使用调试器(
gdb
)^^^^^巴兹尔说的话。这也会给你一个警告,
else(choice==2)
没有任何意义。(虽然这不是故障的原因。)谢谢!就这样!我在看教程的一部分。这个家伙从来没有初始化过我…仍然在他身上工作!什么!再次感谢!这说明了教程的质量…远离它!