C 获取字符和整数作为输入,或仅获取字符作为输入
正在开发一个C背包程序,该程序将具有类似UI的界面,我已经到了一个地步,我需要用户能够为命令输入字符,而所有只需要一个字符输入的字符都非常简单,我需要允许用户在从命令中添加或删除数字的情况下同时输入C 获取字符和整数作为输入,或仅获取字符作为输入,c,user-interface,user-input,C,User Interface,User Input,正在开发一个C背包程序,该程序将具有类似UI的界面,我已经到了一个地步,我需要用户能够为命令输入字符,而所有只需要一个字符输入的字符都非常简单,我需要允许用户在从命令中添加或删除数字的情况下同时输入char和int背包。虽然我知道这可以通过用户的两个单独输入来完成,但我想知道如何在同一行中完成,而不需要用户输入两个单独的输入。例如,如果用户键入7,那么它将向背包中添加7 代码 #include <stdio.h> #include "knapsack.c" #include <
char
和int
背包。虽然我知道这可以通过用户的两个单独输入来完成,但我想知道如何在同一行中完成,而不需要用户输入两个单独的输入。例如,如果用户键入7,那么它将向背包中添加7
代码
#include <stdio.h>
#include "knapsack.c"
#include <stdlib.h>
#include <string.h>
int main()
{
listitemptr k2 = NULL;
char input[100];
int *returnval;
while(*input != 'q'){
printf("> ");
fgets(input, 100, stdin);
if(*input == 'p'){
KnapsackPrint(&k2);
}
else if(*input == 'a'){
printf("test\n");
sscanf(input, "%d", returnval);
printf("%d\n", *returnval);
}
else if(*input == 'r'){
}
else if(*input == 'l'){
}
else if(*input == 's'){
}
}
}
#包括
#包括“背包c”
#包括
#包括
int main()
{
listitemptr k2=NULL;
字符输入[100];
int*returnval;
而(*输入!=“q”){
printf(“>”);
fgets(输入,100,标准输入);
如果(*输入=='p'){
背包印(&k2);
}
如果(*输入=='a',则为else{
printf(“测试”);
sscanf(输入,“%d”,返回值);
printf(“%d\n”,*returnval);
}
如果(*输入=='r'),则为else{
}
如果(*输入=='l'),则为else{
}
如果(*输入=='s'),则为else{
}
}
}
有许多解决用户输入问题的方法。我建议你用fgets()
一次读一行,然后用sscanf()来解析:
#包括
#包括
#包括
#包括“背包c”
int main(){
字符输入[100];
listitemptr k2=NULL;
int i,returnval=0;
char命令;
对于(;;){
printf(“>”);
如果(!fgets(输入,输入大小,标准输入))
打破
i=strspn(输入“\t\n”);/*跳过空格*/
命令=输入[i++];
如果(命令=='#'| |命令=='\0'){
/*忽略注释行和空行*/
继续;
}
如果(命令=='q'&&input[i]='\n')
打破
}
如果(命令=='p'){
背包印(&k2);
继续;
}
如果(命令=='a'){
国际项目;
如果(sscanf(输入+i、%i、&项)!=1){
printf(“无效输入\n”);
继续;
}
背包添加(和k2,项目);
继续;
}
//添加更多命令
printf(“未知命令:%c\n”,命令);
}
返回值;
}
读取字符;如果是一个带数字的命令,请阅读该命令。可能一次读一整行并解析它;使错误处理更容易。例如,对于if语句,如何动态读取该字符?我不能完全像*input='a%d'那样使用fgets
读取一行,然后分析该行scanf
并非适用于所有情况。int c;if((c=getchar())!=EOF){if(c=='a'){int d;if(scanf(“%d”,&d)==1){/*do stuff*/}else{/*error reading d*/}}else{/*c是其他东西*/}else{/*error reading c*/}
或其他任何东西。您还可以使用%d
读取输入-如果不匹配,请使用%c“
要扫描单个字符,如何对其进行重新处理,以便在输入命令quit
时不会终止程序?@BretHasel:您可以更改程序以在(;;)的之后执行其他任务
循环,或者您可以更改break
语句并在那里编写适当的代码…哦,不,请允许我重新措辞,我不是说输入q之后,我特别是指输入QUIT之后。因此,q被视为一个退出语句,但短语quit不是。或任何以所需名称开头的单词letters@BretHasel:如果需要word命令,则应测试单词而不是单个字母。为此,您可以使用strcspn(input+i,“\t\n”)
获取单词的长度,并使用memcmp()
与命令名进行比较。或者,您可以使用strtok()
或strtok\u r()
。
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include "knapsack.c"
int main() {
char input[100];
listitemptr k2 = NULL;
int i, returnval = 0;
char command;
for (;;) {
printf("> ");
if (!fgets(input, sizeof input, stdin))
break;
i = strspn(input, " \t\n"); /* skip blanks */
command = input[i++];
if (command == '#' || command == '\0') {
/* ignore comment lines and blank lines */
continue;
}
if (command == 'q' && input[i] == '\n')
break;
}
if (command == 'p') {
KnapsackPrint(&k2);
continue;
}
if (command == 'a') {
int item;
if (sscanf(input + i, "%i", &item) != 1) {
printf("invalid input\n");
continue;
}
KnapsackAdd(&k2, item);
continue;
}
// add more commands
printf("unknown command: %c\n", command);
}
return returnval;
}