【问题标题】:Passing argument 2 of strcmp makes pointer from integer without a cast传递 strcmp 的参数 2 使指针从整数而不进行强制转换
【发布时间】:2016-11-14 16:43:27
【问题描述】:
void viewonechar(){

char name[25], c[25];
int n;

fp = fopen("Phonebook.txt","r");

printf ("\n\n Enter Character : ");
scanf ("%s",c);

fscanf (fp, "%s %d", name, &n);

while (!feof(fp)){

    if ((strcmp(c, name[0])) == 0){  \\ Warning in here

        printf (" %s +880%d\n",name, n);

    }

    fscanf (fp, "%s %d", name, &n);

}

printf ("\n\n");

fclose(fp);

menu();

}

当我编译代码时,在标记的行上会出现这个警告,“传递 strcmp 的参数 2 使指针从整数而不进行强制转换”。我到底做错了什么?

【问题讨论】:

  • 如果name 是一个char[25] 数组,你认为name[0] 是什么? strcpy 需要 const char* 作为第二个参数; name[0]不是那个。
  • 请注意,错误消息显示“整数”而不是 intchar 类型(即每个数组元素)是整数类型。
  • 你想比较什么?只有名称的第一个字符和 c? if (name[0] == c[0]) {... 呢?或从 c 到名称开头的所有字符 if (strncmp(c, name, strlen(c)) == 0) {...
  • 旁白:while (!feof(fp)){ ==> while (fscanf (fp, "%s %d", name, &n) == 2){ 并删除另外两个 fscanf 语句。循环最好通过测试正确转换来控制。
  • 使用 -Wall -Wextra -Werror 等完整标志进行编译也是一个好习惯,因为您会看到到底有什么问题

标签: c


【解决方案1】:

int strcmp(const char * str1, const char * str2);

因为namechar 的数组,所以name[0]charstrcmpchar 指针作为参数,因此您提供的 char 隐式转换为 int 类型,然后 - 转换为指针,这会产生未定义的行为,并且很可能会导致段错误。

【讨论】:

  • 我想从'name'中获取第一个字符并与c进行比较。我该怎么做?
  • @AnikShahriar:因为c 也是一个数组,所以您可能需要if (c[0] == name[0]) 来比较前两个字符。
  • c 也是一个数组。如何将一组字符与一个字符进行比较?
  • strchr功能。
  • @AnikShahriar :如果这是你想做的,那么你应该问这个问题。 chars 是整数类型,可以直接与== 运算符比较:if( c[0] == name[0] )。可能c 不必是一个数组,而只是一个char,(即char c ;)在这种情况下scanf 应该更改为scanf ("%c",&c);
【解决方案2】:

有很多问题。

以下代码修复了上述问题:

void viewonechar(void) 
{
    char name[25], c[25];
    int n;

    FILE    fp = fopen("Phonebook.txt","r");

    if (!fp) {
        perror("fopen");
        exit(1);
    }

    printf ("\n\n Enter Character : ");
    if (fgets(c, sizeof c, stdin) == NULL) {
        fprintf(stderr, "Input error\n");
        exit(1);
    }

    while (fscanf (fp, "%24s %d", name, &n) == 2) {
        if (c[0] == name[0]) {
            printf (" %s +880%d\n",name, n);
        }  
    }
    printf ("\n\n");
    fclose(fp);
    menu();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-05
    • 2019-02-18
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多