C 为什么在尝试输入字符串时会出现seg错误?
我使用do-while循环作为菜单。用户将输入与命令相对应的数字。然后,应该出现与该数字相关的函数。对于switch语句中的第一个案例(名称输入),我需要帮助。当我运行代码时,会出现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[
#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
中的所有违规字符都未读;最后
返回值等于表示每个变量中存储了有效值的转换说明符的数量
(您仍然必须验证您收到的任何输入是否满足任何约束,例如1char*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)