【问题标题】:passing arg 1 of `strcspn' from incompatible pointer type从不兼容的指针类型传递 `strcspn' 的 arg 1
【发布时间】:2020-05-11 02:38:25
【问题描述】:

所以我正在制作一个获得 10 个名字的函数。我尝试使用 strcspn() 从字符串末尾删除 \n 。但是我收到了这个警告。

#define NUM_OF_NAMES 10
#define STR_LEN 50

void input (char arr[][STR_LEN]);


int main()
{
    char str [NUM_OF_NAMES][STR_LEN] = {0};
    input(str);

    return 0;
}
void input (char arr[][STR_LEN])
{
    int i = 0;
    printf("Enter 10 names:\n");

    for (i = 0; i < NUM_OF_NAMES; i++)
    {
        fgets(arr[i], STR_LEN, stdin);
        arr[i][strcspn(arr, "\n")] = 0;
    }
    for (i = 0; i < NUM_OF_NAMES; i++)
    {
        puts(arr[i]);
    }
}

【问题讨论】:

  • 第一个参数应该是 char * 而不是指针数组(或 char [] 而不是 char [][] 以匹配您的声明)。
  • 提示:更好的代码会在使用arr[i]之前测试fgets()的结果。

标签: c multidimensional-array newline c-strings


【解决方案1】:

你输入了一个字符串

    fgets(arr[i], STR_LEN, stdin);

并将删除字符串的附加换行符。然后使用字符串!

    arr[i][strcspn(arr[i], "\n")] = 0;

【讨论】:

    【解决方案2】:

    您将arr 传递给strcspn():类型不正确,因为arr 是指向STR_LEN 字符数组的指针。您应该改为传递 arr[i],它会衰减为指向 char 数组的指针,这是 strcspn() 的两个参数的预期类型。

    请注意,您还应该测试fgets() 的返回值,以检测文件的意外结束并避免意外行为。

    #include <stdio.h>
    #include <string.h>
    
    #define NUM_OF_NAMES 10
    #define STR_LEN 50
    
    int input(char arr[][STR_LEN]);
    
    int main() {
        char str[NUM_OF_NAMES][STR_LEN] = { 0 };
        input(str);
    
        return 0;
    }
    
    int input(char arr[][STR_LEN]) {
        int i, n;
    
        printf("Enter 10 names:\n");
        for (i = 0; i < NUM_OF_NAMES; i++) {
            if (!fgets(arr[i], STR_LEN, stdin))
                break;
            arr[i][strcspn(arr[i], "\n")] = '\0';
        }
        n = i;
        for (i = 0; i < n; i++) {
            puts(arr[i]);
        }
        return n;
    }
    

    【讨论】:

      猜你喜欢
      • 2013-12-25
      • 2016-03-28
      • 1970-01-01
      • 1970-01-01
      • 2018-02-27
      • 2017-12-11
      • 1970-01-01
      • 2020-06-07
      • 1970-01-01
      相关资源
      最近更新 更多