2016-11-28 79 views
2

我建立一个程序,该程序需要读取来自用户的命令的形式输入,例如后“命令12”,其中命令是特定词和需要被存储在单独的变量,数它也需要在其变量中。检查是否输入相匹配的字用C

我创建的变量,其中是字需要以匹配命令和int变量用于存储。

char rule[5] = {'r', 'u', 'l', 'e', '\0'}; 
char command[6]; 
int cmd_num; 

然后用scanf读取它,然后用strcmp比较它。

scanf("%s %d", &command, &cmd_num); 
if ((strcmp(command, rule)) != 0) 
{ 
    printf("Error.\n"); 
    return 1; 
} 

然而,它不工作,因为我期望它。我搜索了几个小时,但我无法找到如何正确存储此字符串和数字。任何人都可以帮助我理解字符串是如何存储的?这将帮助我理解为什么strcmp不能按我期望的方式工作。

或者有什么更好的方法来检查,如果用户输入匹配某个单词?这个数字似乎对我来说是个问题。我试图玩弄功能,但我无法得出结果。先谢谢你。

回答

2

首先,你可以直接定义rule为使用字符串双引号(并避免写进去,使它成为一个常量指针):

const char *rule = "rule"; 
char command[6]; 
int cmd_num; 

当您使用scanf,限长阅读,以避免缓冲区溢出(使用%5s这是阵列减去零终止的最大尺寸),和不通过地址的阵列/指针,因为scanf已经可以访问字符串的地址写入到:

nb_items = scanf("%5s %d", command, &cmd_num); 

注意,您可以知道有多少项目已被扫描(声明int nb_items;)。例如,如果用户忘记输入号码或输入一个非数字,你会得到nb_items==1,你就会知道,cmd_num尚未初始化。

这里的主要问题是您有未定义的行为试图将您的scanf的结果存储在数组地址中。

+0

我试图使用的scanf(%5秒)的限制,问题是,我有两个命令,我不知道该用户将键入哪一个,我需要认识到他们两个不幸的是,他们是不一样的长度为 – Pernick

+0

那么你的命令缓冲区太小了。将其增加到最大的命令长度。不检查缓冲区可能会导致程序崩溃。 5是最大限制。你不必输入5个字符。 –

+0

我试过了,但是然后strcmp不起作用,难道不是因为字符串不相等吗?可以说我的输入是'乌鸦12',我有const char * raven =“raven”;当我在这两个上使用strcmp时,它不起作用,尽管当我打印它们时,它们会打印相同的字符串。 – Pernick

相关问题