任何人都可以帮我处理我的代码
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");
}
当我试图将我的程序放到表格菜单中时,我遇到了问题:
输出将是这样的
Please Input your Complete Name: John Kenneth
Your Name is: John Kenneth
答案 0 :(得分:2)
使用标准函数fgets
。例如
fgets( name, sizeof( name ), stdin );
name[strcspn( name, "\n" )] = '\0';
考虑到使用goto语句是个坏主意。你应该忘记C中有goto语句。而是使用while
或do-while
循环。
答案 1 :(得分:0)
你的问题在于
scanf("%[^\n]s", &name);
它有两个问题:
%[
需要char*
,但您提供char(*)[100]
。s
不属于%[
说明符。解决这些问题,你得到
scanf("%[^\n]", name);
但是您会注意到您再次获得相同的输出。这是因为如果要读取的第一个字符是%[^\n]
,\n
将失败。想知道这个角色来自哪里?记得在输入上一个scanf
的号码后按 Enter ? stdin
使scanf("%[^\n]", name);
失败,这个字符占优势。
您也可以通过在格式字符串之前添加空白字符(例如空格)来指示scanf
在阅读之前丢弃/跳过所有空白字符来解决此问题:
scanf(" %[^\n]", name);
现在它按预期工作。
请注意,最好使用长度说明符限制scanf
要读取的字符数,以便释放一些缓冲区溢出。这可以通过使用:
scanf(" %99[^\n]", name);
我使用了99,因为必须为字符串末尾的NUL终结符('\0'
)保留额外的空格。
此外,最好检查scanf
的返回值,看看它是否成功:
if(scanf(" %99[^\n]", name) != 1)
/* Input error or EOF */