gets()的输入与保存在char数组中的值不匹配
我使用用户输入来控制程序。我有两个数组 第一个是名为gets()的输入与保存在char数组中的值不匹配,c,C,我使用用户输入来控制程序。我有两个数组 第一个是名为controlWord的一维字符数组(这将存储用户输入) 第二个是一个名为promptWord的二维数组(一个字符数组数组,其中包含与代码将执行的操作相对应的单词) 当提示用户输入时,我使用get()将输入保存到第一个字符数组中。然后我将这个字符数组与第二个字符数组进行比较,第二个字符数组充满了用户可能输入的提示词 printf("\n\ncontrolword: "); gets(controlWord); if (strcmp(contr
controlWord
的一维字符数组(这将存储用户输入)
第二个是一个名为promptWord
的二维数组(一个字符数组数组,其中包含与代码将执行的操作相对应的单词)
当提示用户输入时,我使用get()
将输入保存到第一个字符数组中。然后我将这个字符数组与第二个字符数组进行比较,第二个字符数组充满了用户可能输入的提示词
printf("\n\ncontrolword: ");
gets(controlWord);
if (strcmp(controlWord, promptWord[0]))//Add
{
//stuff
}else if (strcmp(controlWord, promptWord[1]))//Listen
{
//more stuff
}else
我不想搜索子字符串。我只想要精确匹配的。即使在仔细输入了应该可以工作的字符串之后,我也会得到一个错误。(尤其是带有“?”)
编辑:
如前所述,“获取
/fgets
将换行符“\n”也存储在缓冲区中。如果将用户输入与字符串文字(如“abc”)进行比较,它将永远不会匹配”
所以现在我有一个第22条:我可以使用gets()
,这被认为是不好的做法,或者我可以使用fgets()
,这将获取一个新行字符。我想我可以输入并清空最后一个非零字符,但是如果我的输入长度正好是99或100个字符呢?我的字符数组中只有前100个字符的空间,所以我怎么知道我有99个字符+一个新行还是100个字符而我丢失了新行
我正在寻找一种解决方案,它可以避免获取
,但比fgets
搜索空字符更优雅。我建议使用它来解决这个问题
您可以这样处理\n
问题:
if (controlWord[slen-1] == '\n') {
controlWord[slen-1] = '\0';
搜索\n
,然后如果它存在于正确的位置,n-1
,则将其替换为空终止字符\0
,该字符标记字符串的结尾。如果情况并非如此,则会出现缓冲区溢出
您也可以使用上面评论中从@melpomene突出显示的巧妙方式:
str[strcspn(str, "\n")] = '\0';
以下是帮助您完成任务的基本示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define CONTROL_LEN 100
#define NUM_COMMANDS 5
int
main(int argc, char *argv[]) {
char controlWord[CONTROL_LEN+1];
char promptWord[NUM_COMMANDS][CONTROL_LEN]={"Add","Subtract","Multiply","Divide","?"};
size_t slen, i;
int found = 0;
printf("controlword: ");
if (fgets(controlWord, CONTROL_LEN, stdin) == NULL) {
printf("Error reading command.\n");
return 1;
}
slen = strlen(controlWord);
if (slen > 0) {
if (controlWord[slen-1] == '\n') {
controlWord[slen-1] = '\0';
} else {
printf("Error: Exceeded Buffer length of %d.\n", CONTROL_LEN);
return 1;
}
}
if (!*controlWord) {
printf("Error: No command entered.\n");
return 1;
}
for (i = 0; i < NUM_COMMANDS; i++) {
if (strcmp(controlWord, promptWord[i]) == 0) {
found = 1;
}
}
if (found) {
printf("Match found for command: %s\n", controlWord);
} else {
printf("No match found for command: %s\n", controlWord);
}
return 0;
}
#包括
#包括
#包括
#定义控件\u LEN 100
#定义NUM_命令5
int
main(int argc,char*argv[]){
字符控制字[CONTROL_LEN+1];
char promptWord[NUM_COMMANDS][CONTROL_LEN]={“加法”、“减法”、“乘法”、“除法”、“?”};
尺寸(slen),i ;;
int=0;
printf(“控制字:”);
如果(fgets(控制字、控制列、标准输入)=NULL){
printf(“读取命令时出错。\n”);
返回1;
}
slen=strlen(控制字);
如果(slen>0){
如果(控制字[slen-1]='\n'){
控制字[slen-1]='\0';
}否则{
printf(“错误:超出了%d的缓冲区长度。\n”,控件长度);
返回1;
}
}
如果(!*控制字){
printf(“错误:未输入命令。\n”);
返回1;
}
对于(i=0;i
我建议使用
您可以这样处理\n
问题:
if (controlWord[slen-1] == '\n') {
controlWord[slen-1] = '\0';
搜索\n
,然后如果它存在于正确的位置,n-1
,则将其替换为空终止字符\0
,该字符标记字符串的结尾。如果情况并非如此,则会出现缓冲区溢出
您也可以使用上面评论中从@melpomene突出显示的巧妙方式:
str[strcspn(str, "\n")] = '\0';
以下是帮助您完成任务的基本示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define CONTROL_LEN 100
#define NUM_COMMANDS 5
int
main(int argc, char *argv[]) {
char controlWord[CONTROL_LEN+1];
char promptWord[NUM_COMMANDS][CONTROL_LEN]={"Add","Subtract","Multiply","Divide","?"};
size_t slen, i;
int found = 0;
printf("controlword: ");
if (fgets(controlWord, CONTROL_LEN, stdin) == NULL) {
printf("Error reading command.\n");
return 1;
}
slen = strlen(controlWord);
if (slen > 0) {
if (controlWord[slen-1] == '\n') {
controlWord[slen-1] = '\0';
} else {
printf("Error: Exceeded Buffer length of %d.\n", CONTROL_LEN);
return 1;
}
}
if (!*controlWord) {
printf("Error: No command entered.\n");
return 1;
}
for (i = 0; i < NUM_COMMANDS; i++) {
if (strcmp(controlWord, promptWord[i]) == 0) {
found = 1;
}
}
if (found) {
printf("Match found for command: %s\n", controlWord);
} else {
printf("No match found for command: %s\n", controlWord);
}
return 0;
}
#包括
#包括
#包括
#定义控件\u LEN 100
#定义NUM_命令5
int
main(int argc,char*argv[]){
字符控制字[CONTROL_LEN+1];
char promptWord[NUM_COMMANDS][CONTROL_LEN]={“加法”、“减法”、“乘法”、“除法”、“?”};
尺寸(slen),i ;;
int=0;
printf(“控制字:”);
如果(fgets(控制字、控制列、标准输入)=NULL){
printf(“读取命令时出错。\n”);
返回1;
}
slen=strlen(控制字);
如果(slen>0){
如果(控制字[slen-1]='\n'){
控制字[slen-1]='\0';
}否则{
printf(“错误:超出了%d的缓冲区长度。\n”,控件长度);
返回1;
}
}
如果(!*控制字){
printf(“错误:未输入命令。\n”);
返回1;
}
对于(i=0;i
首先,阅读:“永远不要使用gets()。接下来,阅读您的C文本手册或搜索如何在C中比较字符串(提示:这不是与==
)。可能重复@kaylum谢谢!您链接的问题提供了帮助,但也解释了get()/fgets()都将获取新行字符,因此在我尝试与字符串文字进行比较时失败。我要编辑我的问题否,获取
不存储新行字符。只有fgets
有此功能。str[strcspn(str,“\n”)]='\0'代码>将删除尾随的换行符。首先,阅读:“永不使用gets()。接下来,阅读您的C文本手册或搜索如何在C中比较字符串(提示:这不是与==
)。可能重复@kaylum谢谢!您链接的问题提供了帮助,但也解释了get()/fgets()都将获取新行字符,因此在我尝试与字符串文字进行比较时失败。我要编辑我的问题否,获取
不存储新行字符。只有fgets
有此功能。str[strcspn(str,“\n”)]='\0'代码>将清除一个trai