передача аргумента 1 `strcspn 'из несовместимого типа указателя - PullRequest
3 голосов
/ 24 января 2020

так что я делаю функцию, которая получает 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]);
    }
}

Ответы [ 2 ]

2 голосов
/ 24 января 2020

Вы ввели строку

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

и собираетесь удалить добавленный символ новой строки в строке. Тогда используйте строку!

    arr[i][strcspn(arr[i], "\n")] = 0;
0 голосов
/ 24 января 2020

Вы передаете 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;
}
...