所以任务是将大写开头的句子中的每个单词都变成“ ***”。
`
for (i = 1; input[i] != '\0'; i++)
if(isupper(input[i])) input[i] = '***';
printf("\n Changed sentence is: %s", input);
`
这是我到目前为止编写的代码。它只能更改一个字符,但我不知道如何用他的整个单词来完成。
答案 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)
通过将一个字符更改为三个字符(将其更改为三个星星),可以更改字符串的长度。尝试从那里开始。 [此问题可能会影响循环的工作方式]