把一个单词变成***符号

时间:2018-11-20 19:31:52

标签: c char

所以任务是将大写开头的句子中的每个单词都变成“ ***”。

`

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

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

`

这是我到目前为止编写的代码。它只能更改一个字符,但我不知道如何用他的整个单词来完成。

5 个答案:

答案 0 :(得分:2)

我假设input是正确分配的,以null结尾的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 ] = '*';
    }
}

答案 1 :(得分:1)

以下是可能的解决方案:

#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 ***.

答案 2 :(得分:1)

通读该行。 如果将字符大写,请输入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 *****!

答案 3 :(得分:0)

好吧,根据评论中看到的反馈,这是我的版本,它不依赖于输入行长或程序可用的内存。它实现了一个有限状态自动机(三个状态),以检测第一个字母,下一个字母和非单词字母。可能的实现之后:

#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 */

答案 4 :(得分:-1)

通过将一个字符更改为三个字符(将其更改为三个星星),可以更改字符串的长度。尝试从那里开始。 [此问题可能会影响循环的工作方式]