Aqui não precisamos nos preocupar com código HTML inválido, não precisamos nos preocupar com aba aberta sem fechar, vivemos no mais puro paraíso. Com isso, o que precisamos fazer é só substituir os underlines por tags itálico e os asteriscos por tags negrito, guardando em uma variável se já abrimos uma tag dessas antes ou não. Essa variável é consultada antes de colocarmos a tag e o valor dela troca sempre após colocarmos a tag apropriada.
Um detalhe interessante para as linguagens JavaScript e Python é que eu não uso o replace indiscriminadamente porque alguns dos underlines abrem e outros fecham, mesma coisa para os asteriscos, então precisa-se trocar com certo critério.
#include<string.h>#include<stdio.h>intmain(){char frase[51];int n, negrito, italico;while(gets(frase)!=NULL){ negrito =0; italico =0; n =strlen(frase);for(int i =0; i < n; ++i){if(frase[i] =='_'){printf("%s", italico ?"</i>":"<i>"); italico =1- italico; }elseif(frase[i] =='*'){printf("%s", negrito ?"</b>":"<b>"); negrito =1- negrito; }else{printf("%c", frase[i]); } }printf("\n"); }return0;}