Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.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/7/user-interface/2.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 获取字符和整数作为输入,或仅获取字符作为输入_C_User Interface_User Input - Fatal编程技术网

C 获取字符和整数作为输入,或仅获取字符作为输入

C 获取字符和整数作为输入,或仅获取字符作为输入,c,user-interface,user-input,C,User Interface,User Input,正在开发一个C背包程序,该程序将具有类似UI的界面,我已经到了一个地步,我需要用户能够为命令输入字符,而所有只需要一个字符输入的字符都非常简单,我需要允许用户在从命令中添加或删除数字的情况下同时输入char和int背包。虽然我知道这可以通过用户的两个单独输入来完成,但我想知道如何在同一行中完成,而不需要用户输入两个单独的输入。例如,如果用户键入7,那么它将向背包中添加7 代码 #include <stdio.h> #include "knapsack.c" #include <

正在开发一个C背包程序,该程序将具有类似UI的界面,我已经到了一个地步,我需要用户能够为命令输入字符,而所有只需要一个字符输入的字符都非常简单,我需要允许用户在从命令中添加或删除数字的情况下同时输入
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;
}