为了账号安全,请及时绑定邮箱和手机立即绑定

使用scanf的分割错误

/ 猿问

使用scanf的分割错误

C
Qyouu 2019-11-20 12:38:47

noob在这里的问题:我正在尝试编写一个简单的菜单界面,但是我一直遇到分段错误错误,我不知道为什么。


#include <stdlib.h>

#include <stdio.h>

int flush(); int add(char *name, char *password, char *type); int delete(char *name);

int edit(char *name, char *password, char *type, char *newName, char *newPassword, char            *newType);

int verify(char *name, char *password);




int menu(){

    int input;

    char *name, *password, *type, *newName, *newPassword, *newType;

    printf("MAIN MENU \n ============\n");

    printf("1. ADD\n");

    printf("2. DELETE\n");

    printf("3. EDIT\n");

    printf("4. VERIFY\n");

    printf("5. Exit\n");

    printf("Selection:");

    scanf("%d", &input);

    flush();

    switch (input){


    case 1:

        printf("%s\n", "Enter Name:");

        scanf("%s", name);

        flush();

        printf("%s\n", "enter password" );

        scanf("%s", password);

        flush();

        printf("%s\n","enter type" );

        scanf("%s",type);

        add(name, password, type);

        menu();

        break;

    case 2:

        printf("Enter Name:" );

        scanf("%s",name);

        flush();

        delete(name);

        menu();

        break;

    case 3:

        printf("Enter Name:\n");

        scanf("%s",name);

        flush();

        printf("Enter Password\n");

        scanf("%s", password);

        flush();            

        printf("enter type:\n");

        scanf("%s", type);

        flush();

        printf("enter your new username:\n");

        scanf("%s",newName);

        flush();

        printf("enter your new password\n");

        scanf("%s", newPassword);

        flush();

        printf("enter your new type\n");

        scanf("%s",newType);

        flush();

        edit(name, password, type, newName, newPassword, newType);

        menu();

        break;

    case 4:

        printf("Enter Name\n");

        scanf("%s",name);

        flush();

        printf("Enter Password\n");

        scanf("%s",password);

        flush();

        verify(name, password);

        menu();

        break;


在任何菜单选项中输入两个字段后,出现分段错误


查看完整描述

2 回答

?
蛊毒传说

您需要初始化指针。或者,使用堆栈分配的数组。

例如,代替char *namechar name[20]。(请注意,这会将您的输入限制为19个字符;如有必要,请使用更大的缓冲区。)

现在,您正在传递未初始化的指针scanf(),这实际上意味着scanf()将要写入未定义的内存区域。它可能会在一个执行中起作用,然后在下一个执行中失败。它可能会破坏进程地址空间中其他位置的内存。

不要使用未初始化的变量,而应考虑将编译器警告尽可能地提高。编译器会捕获到这样的错误并发出警告。


查看完整回答
反对 回复 2019-11-20
?
慕尼黑8549860

代替使用* name,* password,..使用name [100],password [100],...。如果要让name,password,..成为指针,则在调用scanf之前使用malloc或calloc分配内存。


查看完整回答
反对 回复 2019-11-20

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信