Изменение строки через функцию в си

В функцию подается строка. Необходимо утроить каждый символ на четной позиции (начиная с 1), являющийся гласной. Функция возвращает данную строку. Допустим, подается 'абвгде' ,на выходе получается 'абвгдеее'

#include <stdio.h>
#include <stdlib.h>


char *strres(char *s1)
{
    char *res[96];
    int i=0,i1=0;
    while (*(s1+i)!='\0')
    {
        *(res+i1)=*(s1+i);
        if (*(s1+i)=='а' && i%2!=0){
            *(res+i1+1)=*(s1+i+1);
            *(res+i1+2)=*(s1+i+1);
            i1+=2;
        }
        i++;
        i1++;
    }
    return(*res);
}
int main()
{
    char s1[32];
    scanf("%s",s1);
    int n=strres(&s1);
    printf("%d",n);
    return (0);
}

Если я запускаю этот код, функция возвращает ту же строку, что и на вводе. Проверил, оказывается что *(s1+i)- это не символ строки, а число (например вместо e получается -96). Как обратиться именно к символу по его указателю?


Ответы (4 шт):

Автор решения: Qwertiy
char *res[96];
static char res[96];

Ну и дальше нормально переделать.

int n=strres(&s1);
int n = strres(s1);
→ Ссылка
Автор решения: leb

Судя по тройному буферу в strres(), логика работы должна быть приблизительно такой:

#include <stdio.h>

#define STRLEN                  32


/* переделать в соответствие используемой кодировки (скорее всего, cp866) */
int isvowel (unsigned char c)
{
    switch ( c ) {
        case 'a':
        case 'e':
        case 'i':
        case 'o':
        case 'u':
        case 'y':                   return 1;
        default :                   return 0;
    }
}
void strres (char* str)
{
    unsigned char               res[3*STRLEN];
    unsigned char               c;
    int                         pos;
    int                         hold = 0;


    /* наполняем временный массив */
    for (pos = 0; *(str + pos) != '\0'; pos++) {
        c = *(str + pos);
        res[hold++] = c;

        if ( pos && !(pos % 2) && isvowel(c) ) {
            res[hold++] = c;
            res[hold++] = c;
        }
    }

    /* переводим из временного массива в строку */
    for (pos = 0; pos < hold && pos < STRLEN; pos++) {
        *str++ = res[pos];
    }
    *str = '\0';
}





int main (int argc, char* argv[])
{
    unsigned char               s1[STRLEN];


    scanf("%s", s1);
    strres(s1);
    puts(s1);
}
→ Ссылка
Автор решения: Артем Карпов

Вот так должно работать, только кодировка должна быть OEM 866, чтобы гласные правильно кодировать. Но это для Windows. В терминалах других ОС кодировка другая.

#include <stdio.h>
#include <stdlib.h>

const int buf = 32;
    
char *strres(char *s1)
{
    static char res[3*buf];
    char glas[11] = "аеёиоуыэюя";
    int i=0, i1=0;
    while (s1[i]!='\0')
    {
        res[i1] = s1[i];
        i1++;
        for(int k = 0; k < 10; ++k){
            if (s1[i] == glas[k] && i%2 != 0){
                for(int j = 0; j < 2; ++j){
                    res[i1] = glas[k];
                    i1++;
                }
                break;
            }
        }
        i++;
    }
    return res;
}
int main()
{
    char s1[buf];
    for(int i = 0; i < buf; ++i)
        s1[i] = '\0';
    scanf("%s",s1);
    char* n = strres(s1);
    printf("%s",n);
    return 0;
}
→ Ссылка
Автор решения: LolPopGames

Во первых, нужно установить рабочую кодировку (по моему windows-1251, кирилица)

// <stdlib.h>
// `system` выполняет команду командной строки
// команда `chcp 1251` установит кодировку windows-1251 
system("chcp 1251");

если нужно без вывода:

system("@CHCP 1251>NUL");

А во вторых вод исправленный код: (хотел очень подробно с коментами, но получилось душно и грубо, по этому я решил их убрать):

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

void strres(const unsigned char *str, unsigned char *result)
{
    const char vowel_letters[] = "аеёиоуыэюя";
    for (size_t i=0, j=0; i<strlen(str); i++, j++)
    {
        result[j] = str[i];
        
        if (strchr(vowel_letters, str[i]) != NULL && i%2 != 0)
        {
            result[j+1] = str[i];
            result[j+2] = str[i];
            j+=2;
        }
    }
}

int main()
{
    system("@CHCP 1251>NUL");

    char buffer[100] = "";
    char func_buffer[200] = "";
    
    scanf("%s", buffer);
    strres(buffer, func_buffer);

    printf("%s", func_buffer);

    return 0;
}
→ Ссылка