LINUX.ORG.RU

История изменений

Исправление linuhs_user, (текущая версия) :

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

// Длинна без повторений
// Не используется, но пусть будет.
size_t u_lenwrep(const char32_t* src)
{
  size_t i, k, len;
  
  if(!*src) return 0;
  for(i = 1, len = 1;src[i];i++, len++) {
    if(src[i] == src[i-1]) {
      for(k = i + 1;src[k] && src[k] == src[i];k++);
      if(!(i = k)) break;
    }
  }
  return len;
}

// Копирование в dest строки src но без повторений 
size_t u_cpywrep(char32_t* dest, const char32_t* src)
{
  size_t i, j;
  
  if(!*src) return 0;
  *dest = *src;
  for(i = 1, j = 1;src[j];i++, j++) {
    if(dest[i-1] == src[j])
      for(j++;src[j] == dest[i-1];j++);
    if(!(dest[i] = src[j])) break;
  }
  return i;
}

// Вывод char32_t строки
void u_print(char32_t* str)
{
  mbstate_t state;
  char utf8_char[MB_CUR_MAX];
  size_t len;
  
  for(;*str;str++) {
    len = c32rtomb(utf8_char, *str, &state);
    printf("%.*s", (int)len, utf8_char);
  }
}

int main(int argc, char** argv)
{
  setlocale(LC_ALL, "en_US.utf8");
  char32_t str[] = U"юююнииикоооддд неее ннуужжооонн";
  
  u_cpywrep(str, str);
  u_print(str);
  
  return EXIT_SUCCESS;
}

Исправление linuhs_user, :

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

// Длинна без повторений
// Не используется, но пусть будет.
size_t u_lenwrep(const char32_t* src)
{
  size_t i, k, len;
  
  if(!*src) return 0;
  for(i = 1, len = 1;src[i];i++, len++) {
    if(src[i] == src[i-1]) {
      for(k = i + 1;src[k] && src[k] == src[i];k++);
      if(!(i = k)) break;
    }
  }
  return len;
}

// Копирование в dest строки src но без повторений 
size_t u_cpywrep(char32_t* dest, const char32_t* src)
{
  size_t i, j;
  
  if(!*src) return 0;
  *dest = *src;
  for(i = 1, j = 1;src[j];i++, j++) {
    if(dest[i-1] == src[j])
      for(j++;src[j] == dest[i-1];j++);
    if(!(dest[i] = src[j])) break;
  }
  return i;
}

// Вывод char32_t строки
void u_print(char32_t* str)
{
  mbstate_t state;
  char utf8_char[MB_CUR_MAX];
  size_t len;
  
  for(;*str;str++) {
    len = c32rtomb(utf8_char, *str, &state);
    printf("%.*s", (int)len, utf8_char);
  }
}

int main(int argc, char** argv)
{
  setlocale(LC_ALL, "en_US.utf8");
  char32_t str[] = U"юююнииикоооддд неее ннуужжооонн";
  
  u_cpywrep(str, str);
  u_print(str);
  
  return(EXIT_SUCCESS);
}

Исправление linuhs_user, :

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

// Длинна без повторений
// Не используется, но пусть будет.
size_t u_lenwrep(const char32_t* src)
{
  size_t i, k, len;
  
  if(!*src) return 0;
  for(i = 1, len = 1;src[i];i++, len++) {
    if(src[i] == src[i-1]) {
      for(k = i + 1;src[k] && src[k] == src[i];k++);
      if((i = k) == 0) break;
    }
  }
  return len;
}

// Копирование в dest строки src но без повторений 
size_t u_cpywrep(char32_t* dest, const char32_t* src)
{
  size_t i, j;
  
  if(!*src) return 0;
  *dest = *src;
  for(i = 1, j = 1;src[j];i++, j++) {
    if(dest[i-1] == src[j])
      for(j++;src[j] == dest[i-1];j++);
    if(!(dest[i] = src[j])) break;
  }
  return i;
}

// Вывод char32_t строки
void u_print(char32_t* str)
{
  mbstate_t state;
  char utf8_char[MB_CUR_MAX];
  size_t len;
  
  for(;*str;str++) {
    len = c32rtomb(utf8_char, *str, &state);
    printf("%.*s", (int)len, utf8_char);
  }
}

int main(int argc, char** argv)
{
  setlocale(LC_ALL, "en_US.utf8");
  char32_t str[] = U"юююнииикоооддд неее ннуужжооонн";
  
  u_cpywrep(str, str);
  u_print(str);
  
  return(EXIT_SUCCESS);
}

Исходная версия linuhs_user, :

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

// Длинна без повторений
size_t u_lenwrep(const char32_t* src)
{
  size_t i, k, len;
  
  if(!*src) return 0;
  for(i = 1, len = 1;src[i];i++, len++) {
    if(src[i] == src[i-1]) {
      for(k = i + 1;src[k] && src[k] == src[i];k++);
      if((i = k) == 0) break;
    }
  }
  return len;
}

// Копирование в dest строки src но без повторений 
size_t u_cpywrep(char32_t* dest, const char32_t* src)
{
  size_t i, j;
  
  if(!*src) return 0;
  *dest = *src;
  for(i = 1, j = 1;src[j];i++, j++) {
    if(dest[i-1] == src[j])
      for(j++;src[j] == dest[i-1];j++);
    if(!(dest[i] = src[j])) break;
  }
  return i;
}

// Вывод char32_t строки
void u_print(char32_t* str)
{
  mbstate_t state;
  char utf8_char[MB_CUR_MAX];
  size_t len;
  
  for(;*str;str++) {
    len = c32rtomb(utf8_char, *str, &state);
    printf("%.*s", (int)len, utf8_char);
  }
}

int main(int argc, char** argv)
{
  setlocale(LC_ALL, "en_US.utf8");
  char32_t str[] = U"юююнииикоооддд неее ннуужжооонн";
  
  u_cpywrep(str, str);
  u_print(str);
  
  return(EXIT_SUCCESS);
}