比较c中字符串数组的数据

时间:2015-04-28 12:48:56

标签: c arrays string compare

我试图将我用fgets阅读的内容与数组第一列中的单词进行比较,但我无法得到它,我认为它可能是\0 at每个字符串的结尾,但我无法进行比较工作

#include <stdio.h>
#include <string.h>
#define MAX_STRLEN 3  

const char *bdato [][columns]={
    {"tc","Torta Cubana"},
    {"th","Torta Huatulco"},
    {"tm","Torta Mexicana"},
    {"tr","Torta Rusa"},
    {"r", "Refresco"},
    {"a", "Agua sabor"}};

int total() {
    char v[20];
    int flag=0,cont=0;
    fgets(v,sizeof(v),stdin);
    do {
        if(strcmp(v,bdato[cont][0])==0){ /*this*/
            flag=1;
            printf("I found one");
        }
        cont++;
    } while(!(flag==1||cont==5));
}

重写的代码:

  #defines .....
  .............
  .............
 int total(){
 size_t len = strlen(v);
        printf("something here");
        fgets(v,sizeof(v),stdin);
        len = strlen(v);
        if(len>0){
        v[len - 1] = '\0';}
        if(strcmp((v,bdato[cont][0])==0)){
            /*another code*/
        }
 }

4 个答案:

答案 0 :(得分:3)

您的字符串比较失败,因为fgets()包含结束输入行的换行符。

您需要将其删除,例如

const size_t len = strlen(v);
if(len > 0)
  v[len - 1] = '\0';

应该这样做。 if只是为了确保我们不会向后索引。

此外,在依赖fgets()获得有效输入之前,您应检查v是否成功。

答案 1 :(得分:2)

如果您正在使用sh来编译c程序(我猜大多数人都是为这些小样本做的那样),那么学习的好处就是使用程序{{ 1}}使用选项cat,让我们来看看你的程序。为了这个例子,我在你的do中添加了一个printf(),如下所示:

-e

如果我输入Torta Cubana,现在让我们看看输出:

print("%s",v); //note that they are no \n

$(感谢Torta Cubana$ )告诉我们一件事,你的字符串cat -e中有一个\n。 这就是你的strcmp()失败的原因,因为你的数组bdato在你的字符串中没有v

这里有两个选择,第一个和最强干净方式,是从\n移除\n(对于这种情况,放松的答案很好水用快速)。

第二种方式是将v更改为:

bdato

但你不会,不是吗?

答案 2 :(得分:2)

在比较之前,您应删除'\n'数组末尾的v

if (!fgets(v,sizeof(v),stdin))
    return -1;
v[strcspn(v, "\n")] = '\0';

答案 3 :(得分:1)

最简单的&amp;清洁方法就像 @unwind 所建议的那样。但即使采用这种方法,我也总是喜欢使用比strncmp()更安全的strcmp()。这在您面临的场景中特别有用。

在此处应用strncmp()方法&amp;如果您知道fgets()附加换行符,则代码中所需的更改来自:

if(strcmp(v,bdato[cont][0])==0){ /*this*/

if ((strlen(v) == strlen(bdato[cont][0])) && (strncmp(v,bdato[cont][0],strlen(v))==0)){ /*this*/

&#34; -1&#34;在strlen(v)之后忽略换行符。