我试图将我用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*/
}
}
答案 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)
之后忽略换行符。