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