Как работает strcmp в C в этом случае? У меня есть массив до l oop и символ, который необходимо сравнить с каждым элементом в массиве - PullRequest
0 голосов
/ 24 марта 2020

У меня есть массив с именем notes, который

char *NOTES[] = {"A", "Bb", "B", "C", "Db", "D", "Eb", "E", "F", "Gb", "G", "Ab"};

Затем мне нужно реализовать функцию, которая получает индекс notes

int get_note_index(char* string) {}

. Я подумал об использовании предварительно написанного strcmp. метод для сравнения параметра, переданного в аргумент, который является строкой и элементами массива notes.

Я сделал что-то вроде strcmp(string,NOTES[i]), где i увеличивается с a для l oop.

Примечание: передаваемая строка является самой заметкой, такой как A, где выводом будет 0, поскольку после успешного сравнения NOTES[0] будет соответствовать строке аргумента. 1 для "Bb" и так далее.

Я новичок в C, поэтому я не знаю, как эффективно использовать strcmp() или его можно использовать вот так.

Ответы [ 2 ]

1 голос
/ 24 марта 2020

Объявление функции должно выглядеть следующим образом:

size_t get_note_index( const char *a[], size_t n, const char *s ); 

То есть вы должны передать количество элементов в массиве, которое будет использоваться в al oop внутри функции.

Если строка не найдена, функция возвращает позицию после последнего элемента массива.

Вот демонстрационная программа.

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

size_t get_note_index( const char *a[], size_t n, const char *s ) 
{
    size_t i = 0;

    while ( i < n && strcmp( a[i], s ) != 0 ) ++i;

    return i;
}

int main(void) 
{
    const char * NOTES[] = 
    {
        "A", "Bb", "B", "C", "Db", "D", "Eb", "E", "F", "Gb", "G", "Ab"
    };

    const size_t N = sizeof( NOTES ) / sizeof( *NOTES );

    const char *s = "Db";

    size_t pos = get_note_index( NOTES, N, s );

    if ( pos != N )
    {
        printf( "The index of the string \"%s\" is %zu\n", s, pos );
    }
    else
    {
        printf( "The string \"%s\" is not found\n", s );
    }

    s = "Bd";

    pos = get_note_index( NOTES, N, s );

    if ( pos != N )
    {
        printf( "The index of the string \"%s\" is %zu\n", s, pos );
    }
    else
    {
        printf( "The string \"%s\" is not found\n", s );
    }

    return 0;
}

Вывод программы:

The index of the string "Db" is 4
The string "Bd" is not found
0 голосов
/ 24 марта 2020

ваше решение будет выглядеть так:

int get_note_index(char* string) {

   for (int i = 0; i < 12; i++) {
      if (strcmp(string, NOTES[i]) == 0) {
         return i;
      }
   }

  return -1; // not found
}

Вы можете заменить 12 на #define для размера строки тона. Здесь я возвращаю -1, если заметка не совпадает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...