我有一个实验室来比较代码中给出的数组中的两个字符串和来自.txt文件的另一个字符串:
while ((c = getc(fp)) != EOF) {
printf("%c" c);
name1 = c;
test = strcmp(name, name1);
我收到错误:
指针和整数之间的比较
我想知道如何更改C
变量,以便将其与strcmp()
进行比较?
编辑:
int validName(const char name[ ])
{
char name1[100];
int test, c;
FILE *fp = NULL;
fp = fopen("keywords.txt", "r");
if (fp == NULL){
printf("error \n");
exit(1);
}
while ((c = getc(fp)) != EOF) {
fscanf(fp, "%s", name1);
test = strcmp(name, name1);
printf("test =%d\n", test);
if(test ==0){
c = 1;
}
// printf("test1");
}
if (c = 1) {
return 1;
}
else
return 0;
fclose(fp);
}
答案 0 :(得分:2)
替代 :您可以使用fscanf(fp,"%s",name);
并将其与name1
进行比较。而不是逐个字符和形成字符串。
注意:name1应该是char[]
有一些内存。这两个都是char[]
喜欢
您的错误 :您正在strcmp
中比较int和char *。您需要char*
。你可以按照上面提到的方式进行。
char name[30],name1[30];
比较两个字符串将C字符串str1与C字符串str2进行比较。
此函数开始比较每个字符串的第一个字符。如果它们彼此相等,则继续使用以下对,直到字符不同或直到达到终止空字符。此函数执行字符的二进制比较
注意: 为了在看到匹配后停止,您可以轻松拥有
if(strcmp(name,name1)==0)
break;
OR
if(strcmp(name,name1)==0)
{
// call some function to process name
}
回答最后一个问题:好的,在这种情况下,您必须编写自定义函数。然后,您只需忽略所有空格,然后仅比较字母数字字符。 isalpha()
等函数会有所帮助。
答案 1 :(得分:0)
您尝试使用strcmp()
比较非字符串与字符串。
strcmp()
的声明是
int strcmp(const char *str1, const char *str2)
此外,你可以像这样逐行获取
const size_t name1 = 100;
char* line = malloc(name1);
while (fgets(line, name1, fp) != NULL)
{
// bla bla
}
或者,您希望通过空格逐字逐句地尝试代码片段。
while(fscanf(fp, " %s", name1) != EOF)
{
//bla bla
}
所以,我认为你的代码应该像
int validName(const char name[ ]) {
int test;
FILE *fp = NULL;
fp = fopen("keywords.txt", "r");
if (fp == NULL){
printf("error \n");
exit(1);
}
const size_t name1 = 100;
char* line = malloc(name1);
while (fgets(line, name1, fp) != NULL)
{
test = strcmp(name, name1);
printf("test =%d\n", test);
/*
if Return value(test) < 0 then it indicates name is less than name1.
if Return value(test) > 0 then it indicates name1 is less than name.
if Return value(test) = 0 then it indicates name is equal to name1.
*/
if(test == 0) // if name and name1 same
{
return /*something*/
}
}
fclose(fp);
}
答案 2 :(得分:0)
在这部分代码中:
while ((c = getc(fp)) != EOF) {
fscanf(fp, "%s", name1);
test = strcmp(name, name1);
printf("test =%d\n", test);
if(test ==0){
c = 1;
}
当你首先使用getc
然后使用fscanf
时,getc会读取fp的第一个字符,然后fscanf将忽略该字符并从其余部分读取以供例外:
keywords.txt:
Template
,传递的值为Template
因此Template
存储在名称变量中,并存储名称emplate
。
而不是使用:
while ((c = getc(fp)) != EOF)
你可以使用:
while (fscanf(fp, "%s", name1) != EOF)
我认为您希望在test==0
时停止此循环,而不是使用:
if(test ==0){
c = 1;
}
使用:
while (fscanf(fp, "%s", name1) != EOF) {
test = strcmp(name, name1);
printf("test =%d\n", test);
if (test == 0) {
fclose(fp);
return 1;
}
// printf("test1");
}
fclose(fp);
return 0;
注意:返回其余代码后没有帮助,所以我在返回之前放了fclose
。