Strcmp не работает, и я, кажется, не понимаю, почему - преобразование в код ASCII делает программу работающей, как ожидалось - PullRequest
0 голосов
/ 29 апреля 2020

Прежде всего, пожалуйста, не критикуйте то, как написана программа, потому что это то, что мы изучаем в моей стране.

Я знаю, что это смесь C и C ++ и вещей Я использую, устарели, но вот как дела здесь.

Так что я должен сделать программу, которая получает в качестве ввода n слов. Затем я должен напечатать слова с последним в качестве префикса.

например

input: 
n=6 
raita grai raid raion straie rai
output:
raita raid raion

Это моя программа. Он работает, как и ожидалось:

#include <iostream>
#include <string.h>

using namespace std;

int main()
{
    int n;
    char a[100][100];
    bool ok=1;
    cin >> n;
    cin.get();
    for (int i = 0; i < n; i++)
    {
        cin.get(a[i], 100);
        cin.get();
    }
    int p = strlen(a[n - 1]);
    for (int i = 0; i < n - 1; i++)
    {
        for(int j = 0; j < p; j++)
        {
            ok = 1;
            if ((unsigned int)a[i][j] != (unsigned int)a[n-1][j])
            {
                ok = 0;
                break;
            }
        }
        if (ok == 1)
        {
            cout << a[i] << " ";
        }
    }
}

Но изначально это выглядело так:

/* strstr example */
#include <iostream>
#include <string.h>

using namespace std;

int main()
{
    int n;
    char a[100][100];
    bool ok=1;
    cin >> n;
    cin.get();
    for (int i = 0; i < n; i++)
    {
        cin.get(a[i], 100);
        cin.get();
    }
    int p = strlen(a[n - 1]);
    for (int i = 0; i < n - 1; i++)
    {
        for(int j = 0; j < p; j++)
        {
            ok = 1;
            if (strcmp(a[i][j], a[n-1][j]) != 0)
            {
                ok = 0;
                break;
            }
        }
        if (ok == 1)
        {
            cout << a[i] << " ";
        }
    }
}

и выдает некоторые ошибки:

Severity    Code    Description Project File    Line    Suppression State
Error (active)  E0167   argument of type "char" is incompatible with parameter of type "const char *"   ConsoleApplication1 25  

Severity    Code    Description Project File    Line    Suppression State
Error   C2664   'int strcmp(const char *,const char *)': cannot convert argument 1 from 'char' to 'const char *'    ConsoleApplication1     25  

Мне кажется, что я не могу понять, почему это происходит. Кто-нибудь из вас может помочь мне понять? Кроме того, я должен использовать преобразование в (unsigned int) или просто strcmp?

Спасибо.

Ответы [ 3 ]

1 голос
/ 29 апреля 2020

В этом операторе

if (strcmp(a[i][j], a[n-1][j]) != 0)

оба выражения a[i][j] и a[n-1][j] имеют тип char, а функция strcmp ожидает два указателя на строки типа char *.

Таким образом, компилятор выдает ошибку.

Вы можете упростить свою первую программу, используя стандартную функцию strncmp. Например

size_t p = strlen(a[n - 1]);
for (int i = 0; i < n - 1; i++)
{
    if ( strncmp( a[i], a[n-1], p ) == 0 ) cout << a[i] << " ";
}

Обратите внимание, что вы должны использовать заголовок <cstring> вместо заголовка <string.h>,

1 голос
/ 29 апреля 2020
 int strcmp(const char *s1, const char *s2);

strcmp используется для сравнения string и string. Но в вашем коде вы сравниваете char и char (a[i][j] и a[n-1][j]).

В вашем случае вы можете использовать strncmp, который сравнивает только первое (самое большее) n байт (в вашем случае n равно strlen(a[n-1])) двух строк:

int strncmp(const char *s1, const char *s2, size_t n);

Итак, ваша программа выглядит следующим образом:

    for (int i = 0; i < n - 1; i++)
    {
        ok = 1;
        if (strncmp(a[i], a[n-1], p) != 0)
        {
            ok = 0;
        }
        if (ok == 1)
        {
            cout << a[i] << " ";
        }
    }
0 голосов
/ 29 апреля 2020

Самое простое изменение кода в вопросе - изменить тест с if (strcmp(a[i][j], a[n-1][j]) != 0) на if (a[i][j] != a[n-1][j]).

...