strncmp — сравнение строк c ++ с подстановочными значениями

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

Я пытаюсь сделать простую программу базы данных, и я застрял в поиске требования для этого.
При поиске пользователь должен иметь возможность ввести знак вопроса, если он не знает значения. Если бы вы знали, что фильм был из 90-х, вы могли бы ввести 199? и он найдет все фильмы, которые соответствуют 199_. Я получаю ошибки при компиляции «не могу преобразовать ‘char *’ в ‘char () [5] для аргумента ‘2’ в ‘bool compareYears (const char, char (*) [5] «Я пытаюсь выяснить большинство из них самостоятельно, и мне нравится разделять функции и заставлять их работать в отдельном файле .cpp перед добавлением их в основной файл, просто чтобы выполнить отладку Полегче.

#include <iostream>
#include <cstring>
#include <fstream>
#include <cctype>
using namespace std;

const int yearLength = 4;
typedef char year[yearLength + 1];

bool compareYears(const year year1, year year2[]);

int main()
{
year year1 = "1992"; //year from database, will be assigned the
//  variable when implemented in main program.
year year2;          //year entered by user, it will be compared to year1.

cout << "Enter a year to search for: ";
cin >> year2;
cout << endl;

if((compareYears(year1, year2)) == true)
cout << "they match\n";
if((compareYears(year1, year2)) == true)
cout << "they do not match\n";

return 0;
}

bool compareYears(const year year1, year year2[])
{
for(int i = 0; i < 4; i++)
{
if (strncom(year1, year2[i], 4) ==0)
return true;
else if (strncmp(year1, "????", 4) == 0)
return true;
else
return false;
}
}

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

0

Решение

Прежде всего, прочитайте это: typedef массив фиксированной длины

Затем используйте этот typedef:

typedef struct year { char characters[4]; } year;

и измените код следующим образом:

int main()
{
year year1;
year1.characters= "1992"; //year from database, will be assigned the variable when implemented in main program.
year year2;          //year entered by user, it will be compared to year1.

cout << "Enter a year to search for: ";
cin >> year2.characters;
cout << endl;

if((compareYears(year1, year2)) == true)
cout << "they match\n";
else
cout << "they do not match\n";

return 0;
}

bool compareYears(year year1, year year2)
{
if (strncom(year1.characters, year2.characters, 4) ==0)
return true;
else if (strncmp(year1, "????", 4) == 0)
return true;
return false;
}

Я также исправил некоторые логические ошибки

1

Другие решения

Просто измените эти строки, и это сработает … объявлению функции нужен массив года, и вы пытаетесь передать переменную ..

if((compareYears(year1, &year2)) == true) //this changed from year2 to &year2
cout << "they match\n";
if((compareYears(year1, &year2)) == true) //this changed from year2 to &year2
cout << "they do not match\n";
1

Тип year2 аргумент в пользу compareYears выглядит странно. Похоже, этот аргумент является mask чтобы проверить, то есть буквальный год, как 1992 или что-то с использованием подстановочных знаков. Следовательно, как насчет сделать это массив символов yearLength байт?

Может быть даже проще написать просто универсальную функцию, которая имеет две строки или произвольную длину (вторая из которых может использовать подстановочные знаки) и проверяет, равны ли они. Проверка качества сначала может определить, имеют ли обе строки одинаковую длину, и если да, то является ли символ в каждой позиции в обеих строках равным или символ в данной позиции во второй строке равен «?». Вы можете использовать один цикл, чтобы пройти обе строки параллельно, чтобы сделать это.

0
По вопросам рекламы [email protected]