инициализация создает указатель из целого числа без приведения

#c

#c

Вопрос:

Моя программа предназначена для создания множественного числа существительного. Ошибка исходит из строки "char *pstr = userNoun[lengthStr - 1];" . Может кто-нибудь сказать мне, в чем была моя ошибка здесь?

 #include <string.h>
#include <stdio.h>
#include <stdlib.h>

void pluralNoun(char userNoun[27]){
    int lengthStr = 0;
    const char caseOne[2] = "es";
    const char caseTwo[2] = "s";
    lengthStr = strlen(userNoun);
    char *pstr = userNoun[lengthStr - 1];

    if(strncmp(pstr - 1, "ch", 2) == 0){
        strcat(userNoun, caseOne);
    }
    else if(strncmp(pstr - 1, "sh", 2) == 0){
        strcat(userNoun, caseOne);
    }
    else if(*pstr == 's'){
        strcat(userNoun, caseOne);
    }
    else if(*pstr == 'y'){
        userNoun[lengthStr - 1] = 'i';
        strcat(userNoun, caseOne);
    }
    else {
        strcat(userNoun, caseTwo);
    }
    printf("The plural of your noun is %sn", userNoun);
}

int main(void){
    char userVar[25];

    printf("Enter a noun no more than 25 characters in length in lower case letters:n");
    scanf("%s", userVar);
    pluralNoun(userVar);

    return 0;
}
  

Комментарии:

1. Вы имели в виду: char *pstr = amp;userNoun[lengthStr - 1];

2. userNoun[lengthStr - 1] является char . Если вам нужен указатель на адрес символа, вы должны выполнить amp;(userNoun[lengthStr - 1]) или арифметику пользовательского указателя напрямую.

Ответ №1:

У вас две ошибки:

  • Причиной проблемы является отсутствие выражения address-of operatorin userNoun[lengthStr-1]
  • Вторая проблема заключается в размере массива «es»: один [2] слишком мал, чтобы соответствовать нулевому терминатору после «es», поэтому в итоге вы получите неопределенное поведение

Поскольку strcat не перераспределяет, убедитесь, что в буфере достаточно места для дополнительного суффикса и нулевого ограничителя.

Комментарии:

1. Еще несколько ошибок: входной буфер слишком мал, ссылка на текстовую строку «не более 25 символов», а строка формата scanf не имеет верхнего предела. Также нет проверок на входных данных, поэтому, например, пустая строка (пользователь нажимает enter) приведет к выходу индексации массива за пределы [lenghtStr — 1]

Ответ №2:

Ошибка, на которую вы указываете в своем вопросе, означает, что вы пытаетесь инициализировать переменную-указатель char *pstr значением userNoun[lengthStr - 1] , которое является char значением (а не char указателем)

Сообщение компилятора, вероятно, звучит немного неточно, но это так. Значение char принимается как число, а целевой тип — нет.