Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么在尝试输入字符串时会出现seg错误?_C_String - Fatal编程技术网

C 为什么在尝试输入字符串时会出现seg错误?

C 为什么在尝试输入字符串时会出现seg错误?,c,string,C,String,我使用do-while循环作为菜单。用户将输入与命令相对应的数字。然后,应该出现与该数字相关的函数。对于switch语句中的第一个案例(名称输入),我需要帮助。当我运行代码时,会出现seg故障。有人能告诉我为什么吗 #include "defs.h" #define MAX_CHAR 32 void nameInput(char name[MAX_CHAR + 1]); int main (void) { int choice = 0; char* name[

我使用do-while循环作为菜单。用户将输入与命令相对应的数字。然后,应该出现与该数字相关的函数。对于switch语句中的第一个案例(名称输入),我需要帮助。当我运行代码时,会出现seg故障。有人能告诉我为什么吗

#include "defs.h"
#define MAX_CHAR 32

void nameInput(char name[MAX_CHAR + 1]);

int main (void)
{
        int choice = 0;
        char* name[MAX_CHAR + 1] = {0};

    do
    {
            printf("Menu\n");
            printf("1. Name\n");
            printf("2. Enter Years, Party, Office, and State \n");
            printf("3. Enter Age and Sex\n");
            printf("4. Enter Contacts \n");
            printf("5. Enter Contributions and Lies \n");
            printf("6. Display Data \n");
            printf("7. Clear all Data \n");
            printf("8. Quit\n");
            scanf("%d", &choice);

            switch (choice)
            {
                    case 1:
                            nameInput(name[MAX_CHAR + 1]);
                            break;
                    case 2:
                            break;
                    case 3:
                            break;
                    case 4:
                            break;
                    case 5:
                            break;
                    case 6:
                            break;
                    case 7:
                            break;
                    case 8:
                            choice = 8;
                            break;
                    default:
                            printf("Input is invalid\n");
                            break;
            }
    } while(choice != 8);

return (0);
}

void nameInput(char name[MAX_CHAR + 1])
{
        int i = 0;

        printf("Type in the politicians name (max 32 characters):");
        for (i = 0; i < 32; i++)
        {
                scanf("%c", &name[i]);
        }
        printf("\n\n");
}
#包括“defs.h”
#定义最大字符32
void name输入(字符名[MAX_char+1]);
内部主(空)
{
int-choice=0;
char*name[MAX_char+1]={0};
做
{
printf(“菜单\n”);
printf(“1.名称\n”);
printf(“2.输入年份、当事人、办公室和州”);
printf(“3.输入年龄和性别”);
printf(“4.输入联系人\n”);
printf(“5.输入贡献和谎言”);
printf(“6.显示数据\n”);
printf(“7.清除所有数据\n”);
printf(“8.Quit\n”);
scanf(“%d”,选择(&C);
开关(选择)
{
案例1:
名称输入(名称[MAX_CHAR+1]);
打破
案例2:
打破
案例3:
打破
案例4:
打破
案例5:
打破
案例6:
打破
案例7:
打破
案例8:
选择=8;
打破
违约:
printf(“输入无效\n”);
打破
}
}while(选项!=8);
返回(0);
}
void name输入(字符名[MAX\u char+1])
{
int i=0;
printf(“键入名称(最多32个字符):”;
对于(i=0;i<32;i++)
{
scanf(“%c”和名称[i]);
}
printf(“\n\n”);
}

函数
nameInput
需要一个指针,当您以
name
作为参数调用函数时,即
nameInput(name)
,这相当于传递
指向数组
name

的第一个元素的指针
nameInput
函数需要一个指针,当您以
name
作为参数调用函数时,即
nameInput(name)
,这相当于传递
指向数组
name

的第一个元素的指针让我们从开头开始。使用
scanf
进行输入时,必须始终检查返回值。每次必须测试三个条件:

  • EOF
    用户是否通过在Linux上按Ctrl+C(或在windows上按Ctrl+Z)生成手动
    EOF
    来取消输入
  • 返回值是否小于格式字符串中包含的转换说明符数?如果是,则出现匹配失败或输入失败,字符提取在错误点停止,使
    stdin
    中的所有违规字符未读;最后
  • 返回值等于表示每个变量中存储了有效值的转换说明符的数量

  • (您仍然必须验证您收到的任何输入是否满足任何约束条件,例如,
    1让我们从头开始。使用
    scanf
    获取输入时,您必须始终检查返回值。您必须每次测试三个条件:

  • EOF
    用户是否通过在Linux上按Ctrl+C(或在windows上按Ctrl+Z)生成手动
    EOF
    来取消输入
  • 返回值是否小于格式字符串中包含的转换说明符的数量?如果是,则会发生匹配失败或输入失败,并在错误点停止字符提取,使
    stdin
    中的所有违规字符都未读;最后
  • 返回值等于表示每个变量中存储了有效值的转换说明符的数量

  • (您仍然必须验证您收到的任何输入是否满足任何约束,例如
    1
    char*name[MAX\u char+1]={0};
    正在定义指针数组,而不是
    char
    数组和
    nameInput(name[MAX\u char+1]);
    正在将其最后一个元素的后面的一个元素传递给函数。@EugeneSh。我已将我的char*name更改为不是指针,但不是。我收到错误消息,说“从整数生成指针而不进行强制转换”。有什么想法吗?
    scanf(“%c”,&name[I]);
    读取为单个字符(将所有其他字符保留在
    stdin中
    )。要读取名称,您需要
    scanf(“%32s”,name);
    (确保读取的
    32
    字符数不超过
    32个,为nul终止字符留出空间)。您还应该删除
    stdin
    中所有剩余的字符,例如
    for(int c=getchar();c!=EOF&&c!='\n';c=getchar()){}
    nameInput(name[MAX\u CHAR+1]);
    -->
    nameInput(name);
    。请发布一个日志,以便我们可以重现问题并帮助您调试。
    CHAR*name[MAX\u CHAR+1]={0};
    正在定义指针数组,而不是
    CHAR
    nameInput(name[MAX\u CHAR+1]);
    正在将其最后一个元素的后面的一个元素传递给函数。@EugeneSh。我已将我的char*name更改为不是指针,但不是。我收到错误消息,说“从整数生成指针而不进行强制转换”。有什么想法吗?
    scanf(“%c”,&name[I]);
    读取为单个字符(将所有其他字符保留在
    stdin中
    )。要读取名称,您需要
    scanf(“%32s”,name);
    (确保读取的
    32
    字符数不超过
    32个,为nul终止字符留出空间)。您还应该在之后从
    stdin
    中删除所有剩余字符,例如
    for(int c=getchar();c!=e)
    
    void empty_stdin (void)
    {
        int c = getchar();
    
        while (c != EOF && c != '\n')
            c = getchar();
    }
    
        int choice = 0;
        char name[MAX_CHAR + 1] = {0};
    
    int nameInput(char *name);
    
    int nameInput(char name[]);
    
    case 1:  nameInput(name);
    
    int nameInput (char name[])
    {
        int rtn;
    
        printf("Type in the politicians name (max 32 characters): ");
    
        rtn = scanf (" %32[^\n]", name);
    
        if (rtn == EOF) {
            fputs ("(user canceled input)\n\n", stdout);
            return -1;
        }
        else if (rtn == 0) {
            empty_stdin();
            return 0;
        }
    
        empty_stdin();
    
        return 1;
    }
    
    #include <stdio.h>
    
    #define MAX_CHAR 32
    
    void empty_stdin (void)
    {
        int c = getchar();
    
        while (c != EOF && c != '\n')
            c = getchar();
    }
    
    int nameInput(char name[]);
    
    int main (void)
    {
        int choice = 0;
        char name[MAX_CHAR + 1] = {0};
    
        do {
                int rtn;    /* variable to hold scanf return */
    
                printf ("\nMenu\n"
                        "  1. Name\n"
                        "  2. Enter Years, Party, Office, and State \n"
                        "  3. Enter Age and Sex\n"
                        "  4. Enter Contacts \n"
                        "  5. Enter Contributions and Lies \n"
                        "  6. Display Data \n"
                        "  7. Clear all Data \n"
                        "  8. Quit\n\n"
                        "   choice: ");
                rtn = scanf ("%d", &choice);
    
                if (rtn == EOF) {
                    fputs ("(user canceled input)\n", stdout);
                    break;
                }
                else if (rtn != 1) {
                    fputs ("  error: invalid integer input.\n", stderr);
                    empty_stdin();
                    continue;
                }
                else {
                    putchar ('\n');
                    empty_stdin();
                }
    
                switch (choice)
                {
                        case 1:
                                {
                                    int nrtn = nameInput(name);
                                    if (nrtn == -1)
                                        goto usercanceled;
                                    else if (nrtn == 1)
                                        printf ("\n  stored: %s\n", name);
                                }
                                break;
                        case 2:
                                break;
                        case 3:
                                break;
                        case 4:
                                break;
                        case 5:
                                break;
                        case 6:
                                break;
                        case 7:
                                break;
                        case 8:
                                break;
                        default:
                                printf("  Input is invalid\n");
                                break;
                }
        } while (choice != 8);
    
        usercanceled:;
    
        return 0;
    }
    
    int nameInput (char name[])
    {
        int rtn;
    
        printf("Type in the politicians name (max 32 characters): ");
    
        rtn = scanf (" %32[^\n]", name);
    
        if (rtn == EOF) {
            fputs ("(user canceled input)\n\n", stdout);
            return -1;
        }
        else if (rtn == 0) {
            empty_stdin();
            return 0;
        }
    
        empty_stdin();
    
        return 1;
    }
    
    $ ./bin/scanf_menu
    
    Menu
      1. Name
      2. Enter Years, Party, Office, and State
      3. Enter Age and Sex
      4. Enter Contacts
      5. Enter Contributions and Lies
      6. Display Data
      7. Clear all Data
      8. Quit
    
       choice: foo
      error: invalid integer input.
    
    Menu
      1. Name
      2. Enter Years, Party, Office, and State
      3. Enter Age and Sex
      4. Enter Contacts
      5. Enter Contributions and Lies
      6. Display Data
      7. Clear all Data
      8. Quit
    
       choice: 1
    
    Type in the politicians name (max 32 characters): Bleach-blond Cheeto
    
      stored: Bleach-blond Cheeto
    
    Menu
      1. Name
      2. Enter Years, Party, Office, and State
      3. Enter Age and Sex
      4. Enter Contacts
      5. Enter Contributions and Lies
      6. Display Data
      7. Clear all Data
      8. Quit
    
       choice: 1
    
    Type in the politicians name (max 32 characters): (user canceled input)