Изменение строки через функцию в си
В функцию подается строка. Необходимо утроить каждый символ на четной позиции (начиная с 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 шт):
char *res[96];
static char res[96];
Ну и дальше нормально переделать.
int n=strres(&s1);
int n = strres(s1);
Судя по тройному буферу в 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;
}
Во первых, нужно установить рабочую кодировку (по моему 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;
}