проблема с русским языком на си. программа работет нормально если подставить английские буквы вместо русских в строку vowels. Помогите

Рейтинг: 0Ответов: 1Опубликовано: 16.02.2023
#include <stdio.h>
#include <string.h>
#include <locale.h>
void ifcharinset(char c, char* vowels, char* setvowels);
int main() {
char str[100];

scanf("%[^\n]s", str);
char x[256] = "f ";
char y[] = " f";
strcat(str, y);
strcat(x, str);
strcpy(str, x);
printf("%s\n", str);

char vowels[] = {'а','е','ё','и','о','у','ы','э','ю','я', '\0'};
char setvowels[] = {'0','0','0','0','0','0','\0'};
int k = 0;

for (int i = 1; i < strlen(str); i++) {
if (str[i] != ' ' && str[i-1] == ' ')
k++;

if (str[i] != ' ' && str[i-1] == ' ' && k > 1 )
{
for(int ii = 0; ii < strlen(vowels); ii++)
{
if (setvowels[ii] == '0')
vowels[ii] = '0';
setvowels[ii] = '0';
}
}
if (str[i] != ' ')
{
ifcharinset(str[i], vowels, setvowels);
}
}

for (int i = 0; i < strlen(vowels); i++) {
    if (vowels[i] != '0')
    printf("%c ", vowels[i]);
}
return 0;
}

void ifcharinset(char c, char* vowels, char* setvowels)
{
for(int i = 0; i < strlen(setvowels); i++)
if (c == vowels[i])
{
setvowels[i] = '1';
}
}

выдает ошибку main.c:21:18: warning: multi-character character constant [-Wmultichar]

Ответы

▲ 0

Используйте тип wchar_t:

#include <stddef.h>
#include <stdio.h>
#include <string.h>
#include <locale.h>
#include <wchar.h>

void is_char_in_set(wchar_t c, wchar_t * vowels, char * setvowels);

int main(void)
{
    wchar_t str[100];
    fgetws(str, 100, stdin); /* ради бога, используйте fgets/fgetws */
    wchar_t x[256] = L"f ";
    wchar_t y[] = L" f";
    wcscat(str, y);
    wcscat(x, str);
    wcscpy(str, x);
    fputws(str, stdout);
    wchar_t vowels[] = L"аеёиоуыэюя";
    char setvowels[] = "000000";
    int k = 0;
    for (size_t i = 1; i < wcslen(str); ++i)
    {
        if (str[i] != L' ' && str[i - 1] == L' ')
        {
            k++;
        }
        
        if (str[i] != L' ' && str[i - 1] == L' ' && k > 1 )
        {
            for (size_t j = 0; j < wcslen(vowels); ++j)
            {
                if (setvowels[j] == '0')
                    vowels[j] = L'0';
                setvowels[j] = '0';
            }
        }
        if (str[i] != ' ')
        {
            is_char_in_set(str[i], vowels, &setvowels[0]);
        }
    }
    for (size_t i = 0; i < wcslen(vowels); ++i)
    {
        if (vowels[i] != '0')
        {
            putwchar(vowels[i]);
        }
    }
    return 0;
}

void is_char_in_set(wchar_t c, wchar_t * vowels, char * setvowels)
{
    for (size_t i = 0; i < strlen(setvowels); ++i)
    {
        if (c == vowels[i])
        {
            setvowels[i] = '1';
        }
    }
}