Превращение слова в символы *** - PullRequest
0 голосов
/ 20 ноября 2018

Таким образом, задача состоит в том, чтобы превратить каждое слово в предложении, начинающемся с заглавной буквы, в "***".

`

for (i = 1; input[i] != '\0'; i++)
    if(isupper(input[i]))   input[i] = '***';

printf("\n Changed sentence is:     %s", input);

`

Этокод, который я написал до сих пор.Это может изменить только один символ, но я не знаю, как это сделать с целым словом.

Ответы [ 5 ]

0 голосов
/ 22 ноября 2018

Что ж, следуя отзывам, замеченным в комментариях, вот моя версия, которая не зависит от длины строки ввода или доступной памяти для программы.Он реализует автомат конечного состояния, три состояния, чтобы обнаружить первую букву, следующие буквы и несловарные буквы.После возможной реализации:

#include <stdio.h>
#include <ctype.h>

#define IDLE    (0)
#define FIRST   (1)
#define NEXT    (2)

int main()
{
    int status = IDLE;
    int c;
    while ((c = getchar()) != EOF) {
        if (isupper(c)) {
            switch (status) {
            case IDLE:
                status = FIRST;
                printf("***");
                break;
            case FIRST: case NEXT:
                status = NEXT;
                break;
            } /* switch */
        } else if (islower(c)) {
            switch (status) {
            case IDLE:
                putchar(c);
                break;
            case FIRST: case NEXT:
                status = NEXT;
            } /* switch */
        } else {
            switch (status) {
            case IDLE:
                putchar(c);
                break;
            case FIRST: case NEXT:
                putchar(c);
                status = IDLE;
                break;
            } /* switch */
        } /* if */
    } /* while */
} /* main */
0 голосов
/ 20 ноября 2018

Прочитайте через строку.Если символ написан заглавными буквами, вводите цикл while до тех пор, пока не получите пробел или конец строки и не замените символы на *.

. Напечатайте строку.

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

int main()
{
  char line[1024] = "This should Replace capitalized Words!";
  int i = 0;

  printf("line: %s\n", line);

  for (i = 0; i < strlen(line); i++) {
    if (isupper(line[i])) {
      while (line[i] != ' ' && line[i] != '\0' && isalpha(line[i])) {
        line[i] = '*';
        i++;
      }
    }
  }

  printf("line: %s\n", line);
  return 0;
}

Выходы

$ gcc -Wall -Werror test.c -o t
line: This should Replace capitalized Words!
line: **** should ******* capitalized *****!
0 голосов
/ 20 ноября 2018

Ниже приведено потенциальное решение:

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

int main(void)
{
    char input[] = "The Mississippi river is very Wide.";

    printf("%s\n", input);

    for(int i = 0; i < strlen(input); i++)
    {
        if((i != 0) && isupper(input[i]))
        {
            printf("*** ");
            while(input[i] != ' ')
                i++;
        }
        else
        {
            printf("%c", input[i]);
        }
    }

    if(ispunct(input[strlen(input) - 1]))
        printf("\b%c\n", input[strlen(input) - 1]);
    else
        printf("\n");

    return 0;
}

Выход

$ gcc main.c -o main.exe; ./main.exe
The Mississippi river is very Wide.
The *** river is very ***.
0 голосов
/ 20 ноября 2018

Полагаю, input - это правильно распределенная строка C с нулевым символом в конце.


Вы сканируете (внутри цикла) по одному символу за раз;Точно так же вы можете изменять один символ за раз.

Таким образом, вам нужна дополнительная переменная, в которой вы храните, если проанализированное слово должно быть преобразовано в последовательность звездочек.

Когда вы встречаете заглавную буквув начале слова переменная установлена ​​в true.

Когда вы сталкиваетесь с концом текущего слова (пробел), вы сбрасываете переменную в false.

Наконец, вы изменяете (илинет) текущий символ соответственно.

Смотрите комментарии в коде

// you need a variable to record if the current word
// should be converted to a sequence of '*'
bool toAsterisk = false;

// sentence scanning loop (one character at a time)
// note that index starts at 0 (not 1)
for (i = 0; input[i] != '\0'; i++)
{
    // check if the current word should be converted to asterisks
    if( isupper( input[i] ) && toAsterisk == false )
    {
        toAsterisk = true;
    }

    // check if you rwach the end of the current word
    if( input[i] == ' ' )
    {
        toAsterisk = true;
    }

    // convert to asterisks?
    if( toAsterisk )
    {
        input[ i ] = '*';
    }
}
0 голосов
/ 20 ноября 2018

Меняя один символ на три (вы меняете их на три звезды), вы меняете длину строки.Попробуйте начать оттуда.[Эта проблема может повлиять на работу цикла]

...