Обработка строк (переменный вывод с одним и тем же вводом)
-1 raijin [2018-05-24 00:16:00]
Возможно, какое-то свойство для меня незаметно, но когда "i" 1, он просто замерзает. Когда я ввожу любую строку, переменная "j" переходит на 700 или 2000 в разных исполнениях. Цель кода состоит в том, чтобы выводить повторяющиеся буквы, если вы вводите "сыр", выход должен быть "eee". Что я делаю неправильно?
#include <stdio.h>
char * repeticoes(char *s) {
int index = 0;
for (int i = 0;( s[i] != '\0'); i++) //problem starts when i is > 0
{
for (int j = 0; ( s[j] != '\0'); j++)
{
if (s[i] == s[j])
{
printf("%c == %c\ni %d j %d\n", s[i], s[j],i,j);
s[index++] = s[i];
}
else
{
printf("not happening %c != %c\ni %d j %d\n", s[i],s[j],i,j);
}
}
}
s[++index] = '\0';
return s;
}
main() {
char input[21];
printf("str 1\n");
fgets(input, 20, stdin);
repeticoes(input);
printf("duplicated letters %s\n", input);
}
c function string
2 ответа
0 Решение user3121023 [2018-05-24 01:46:00]
С массивом букв для подсчета и массивом подсчетов. После того, как буквы будут подсчитаны, снова проведите через вход и установите буквы, которые имеют счет больше одного.
#include <stdio.h>
void repeticoes ( char *s) {
char tocount[] = "abcdefghijklmnopqrstuvwxyz";
size_t len = sizeof tocount;
size_t index = 0;
int count[len];
for (int j = 0; j < len; j++) {
count[j] = 0;
}
for (int i = 0;( s[i] != '\0'); i++) {
for (int j = 0; j < len; j++) {
if ( s[i] == tocount[j]) {
count[j]++;
}
}
}
for (int i = 0;( s[i] != '\0'); i++) {
for (int j = 0; j < len; j++) {
if ( s[i] == tocount[j] && 1 < count[j]) {
s[index] = s[i];
index++;
}
}
}
s[index] = '\0';
}
int main ( void) {
char input[21];
printf("str 1\n");
fgets(input, 20, stdin);
repeticoes(input);
printf("duplicated letters %s\n", input);
return 0;
}
1 Barmar [2018-05-24 00:53:00]
Вам нужно запустить внутренний цикл следующего символа после того, как он обрабатывается во внешнем цикле, иначе вы будете обрабатывать одну и ту же пару символов дважды, а также тестировать символ против себя, когда i == j
.
Вы также должны выйти из внутреннего цикла, как только найдете совпадение. Вы найдете последующие матчи в будущей итерации внешнего цикла. В противном случае вы будете обрабатывать одну и ту же пару дважды.
И вы не должны увеличивать index
до назначения нулевого символа после цикла. Он был добавлен при добавлении повторения.
#include <stdio.h>
char * repeticoes(char *s) {
int index = 0;
for (int i = 0;( s[i] != '\0'); i++) //problem starts when i is > 0
{
for (int j = i+1; ( s[j] != '\0'); j++)
{
if (s[i] == s[j])
{
printf("%c == %c\ni %d j %d\n", s[i], s[j],i,j);
s[index++] = s[i];
break;
}
else
{
printf("not happening %c != %c\ni %d j %d\n", s[i],s[j],i,j);
}
}
}
s[index] = '\0';
return s;
}
int main() {
char input[21];
printf("str 1\n");
fgets(input, 20, stdin);
repeticoes(input);
printf("duplicated letters %s\n", input);
}