输入名称(空格)
Input name with (whitespace)
任何人都可以帮助我的代码
void gotoxy(int, int);
void clrscr();
void dispMenu();
int main(void){
int choice;
choice = 0;
menu:
dispMenu();
scanf("%d", &choice);
if(choice==1){
clrscr();
char name[100];
printf("Please Input your Complete name: ");
scanf("%[^\n]s", &name);
printf("Your name is: %s \n", name);
}
getch();
goto menu;
}
void dispMenu(){
gotoxy(23,9);
printf("List of C-Lang Activities\n");
gotoxy(23,11);
printf("1. Input Name");
gotoxy(23,12);
printf("2. (blank) \n");
gotoxy(23,13);
printf("3. (blank) \n");
gotoxy(23,14);
printf("4. (blank)\n");
gotoxy(23,15);
printf("5. (blank)\n");
gotoxy(23,17);
printf("Please Enter the Number of your choice: ");
}
void gotoxy(int x, int y){
HANDLE hConsoleOutput;
COORD dxCursorPosition;
dxCursorPosition.X = x;
dxCursorPosition.Y = y;
hConsoleOutput = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hConsoleOutput, dxCursorPosition);
}
void clrscr(){
system("cls");
}
我在尝试将我的程序放入 table 菜单时遇到问题,这会出现以下内容:
输出会像这样
Please Input your Complete Name: John Kenneth
Your Name is: John Kenneth
使用标准函数fgets
。例如
fgets( name, sizeof( name ), stdin );
name[strcspn( name, "\n" )] = '[=10=]';
考虑到使用 goto 语句不是一个好主意。您应该忘记 C 中有 goto 语句。请改用 while
或 do-while
循环。
你的问题在于
scanf("%[^\n]s", &name);
它有 2 个问题:
%[
需要 char*
,但您提供了 char(*)[100]
。
s
不是 %[
说明符的一部分。
解决这些问题,您得到
scanf("%[^\n]", name);
但您会注意到您再次获得相同的输出。这是因为如果要读取的第一个字符是 \n
,%[^\n]
将失败。想知道这个角色是从哪里来的?还记得在为前一个 scanf
输入数字后按 Enter 吗?此字符在 stdin
中占主导地位,使 scanf("%[^\n]", name);
失败。
你也可以通过在格式字符串前添加一个白色space字符来指示scanf
到discard/skip所有白色space字符来解决这个问题,比如说,一个space,像这样:
scanf(" %[^\n]", name);
现在它将按预期工作。
请注意,最好使用长度说明符来限制 scanf
读取的字符数,这样您就可以避免一些缓冲区溢出。这可以通过使用来完成:
scanf(" %99[^\n]", name);
我使用了 99,因为必须为字符串末尾的 NUL 终止符 ('[=27=]'
) 保留额外的 space。
还有,最好检查一下scanf
的return值,看是否成功:
if(scanf(" %99[^\n]", name) != 1)
/* Input error or EOF */
任何人都可以帮助我的代码
void gotoxy(int, int);
void clrscr();
void dispMenu();
int main(void){
int choice;
choice = 0;
menu:
dispMenu();
scanf("%d", &choice);
if(choice==1){
clrscr();
char name[100];
printf("Please Input your Complete name: ");
scanf("%[^\n]s", &name);
printf("Your name is: %s \n", name);
}
getch();
goto menu;
}
void dispMenu(){
gotoxy(23,9);
printf("List of C-Lang Activities\n");
gotoxy(23,11);
printf("1. Input Name");
gotoxy(23,12);
printf("2. (blank) \n");
gotoxy(23,13);
printf("3. (blank) \n");
gotoxy(23,14);
printf("4. (blank)\n");
gotoxy(23,15);
printf("5. (blank)\n");
gotoxy(23,17);
printf("Please Enter the Number of your choice: ");
}
void gotoxy(int x, int y){
HANDLE hConsoleOutput;
COORD dxCursorPosition;
dxCursorPosition.X = x;
dxCursorPosition.Y = y;
hConsoleOutput = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hConsoleOutput, dxCursorPosition);
}
void clrscr(){
system("cls");
}
我在尝试将我的程序放入 table 菜单时遇到问题,这会出现以下内容:
输出会像这样
Please Input your Complete Name: John Kenneth
Your Name is: John Kenneth
使用标准函数fgets
。例如
fgets( name, sizeof( name ), stdin );
name[strcspn( name, "\n" )] = '[=10=]';
考虑到使用 goto 语句不是一个好主意。您应该忘记 C 中有 goto 语句。请改用 while
或 do-while
循环。
你的问题在于
scanf("%[^\n]s", &name);
它有 2 个问题:
%[
需要char*
,但您提供了char(*)[100]
。s
不是%[
说明符的一部分。
解决这些问题,您得到
scanf("%[^\n]", name);
但您会注意到您再次获得相同的输出。这是因为如果要读取的第一个字符是 \n
,%[^\n]
将失败。想知道这个角色是从哪里来的?还记得在为前一个 scanf
输入数字后按 Enter 吗?此字符在 stdin
中占主导地位,使 scanf("%[^\n]", name);
失败。
你也可以通过在格式字符串前添加一个白色space字符来指示scanf
到discard/skip所有白色space字符来解决这个问题,比如说,一个space,像这样:
scanf(" %[^\n]", name);
现在它将按预期工作。
请注意,最好使用长度说明符来限制 scanf
读取的字符数,这样您就可以避免一些缓冲区溢出。这可以通过使用来完成:
scanf(" %99[^\n]", name);
我使用了 99,因为必须为字符串末尾的 NUL 终止符 ('[=27=]'
) 保留额外的 space。
还有,最好检查一下scanf
的return值,看是否成功:
if(scanf(" %99[^\n]", name) != 1)
/* Input error or EOF */