Проблема сравнения одного Char с массивом Chars

avatar
Tal Mushkin
8 апреля 2018 в 01:06
59
1
1

Я получаю сообщение об ошибке: "значение в индексе не является ни массивом, ни указателем, ни вектором" для моего кода в строке 14. Похоже, что он должен иметь возможность сравнивать значение в массиве с символом, поскольку они оба примитивных данных, но я не могу понять это правильно:

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

char str[80];
char ch;
int cnt =0;

int suffix ( str, ch) {

int i=0;

while (strchr(str+i, ch) != NULL){

    if (ch == str[i] ){
        printf("\n %s \n", str+i);
        cnt += 1;

    }

    i++;        

}
return cnt;
}

int main() {


printf("\n Please type a single character and then press ENTER: \n");
ch = getchar();
printf("\n You have typed in the character \" %c \".\n", ch);

printf("\n Now please enter a string. Press ENTER to confirm: \n");
scanf("%s", str);
printf("\n The String you typed in is: %s.", str);

suffix(str, ch);
printf("The character \" %c \" appeares %d times in the string. \n", ch, cnt);
return 0;

Источник

Ответы (1)

avatar
Pablo
8 апреля 2018 в 01:11
2

Проблема в том, что вы объявляете функцию следующим образом:

int suffix ( str, ch)
{
    ...
}

, не сообщая компилятору тип str и ch. Таким образом, компилятор предполагает это int, и вы не можете использовать [] на int. Вы должны объявить такие функции

int suffix(char *str, char ch)
{
    ...
}

А почему вы объявляете str, ch и cnt глобальными переменными? Есть абсолютно нет причин для этого.

Таким образом, программа должна выглядеть так:

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

// const char is even better, because you are not modifying the string
int suffix (const char *str, char ch) {

    int cnt = 0;
    int i=0;

    while (strchr(str+i, ch) != NULL){

        if (ch == str[i] ){
            printf("\n %s \n", str+i);
            cnt += 1;

        }

        i++;        

    }
    return cnt;
}

void clean_stdin(void)
{
    int ch;
    while((ch = getchar()) != '\n' && ch != EOF);
}

int main() {

    int ch;
    int cnt;
    char str[100];

    printf("\n Please type a single character and then press ENTER: \n");
    ch = getchar();
    printf("\n You have typed in the character \" %c \".\n", ch);

    clean_stdin(); // to get rid of the newline in the input buffer
                   // or if the user typed more than a single character

    printf("\n Now please enter a string. Press ENTER to confirm: \n");
    scanf("%99s", str);
    printf("\n The String you typed in is: %s.", str);

    cnt = suffix(str, ch);
    printf("The character \" %c \" appeares %d times in the string. \n", ch, cnt);
    return 0;
}
Tal Mushkin
12 апреля 2018 в 14:56
0

Я попробовал ваш код, и теперь у меня новая ошибка: q11.c: В функции «main»: q11.c:41:17: ошибка: «str» необъявлена ​​(первое использование в этой функции) q11.c:41 :17: примечание: каждый необъявленный идентификатор сообщается только один раз для каждой функции, он появляется в q11.c: В функции 'clean_stdin': q11.c:27:1: предупреждение: управление достигает конца непустой функции [-Wreturn- тип]

Pablo
12 апреля 2018 в 19:29
0

@TalMushkin Извините, вы правы, я забыл объявить char str[100] в функции main. Я исправил ответ.