C中的字符串替换?

C中的字符串替换?,c,C,编写一个包含名词和短语的程序 在下列基础上形成复数形式: 这些规则:a。如果名词以“y”结尾 删除“y”并添加“ies”b。如果 名词以“s”、“ch”或“sh”结尾,加上 “es”c。在所有其他情况下,只需添加 “s”打印每个名词及其复数。 尝试以下数据:椅子 奶牛场老板马戏团飞狗 教堂线索盘 到目前为止,我已经掌握了这一点,但它的功能并不像预期的那样: #include<stdlib.h> #include <Windows.h> #include <stdio

编写一个包含名词和短语的程序 在下列基础上形成复数形式: 这些规则:a。如果名词以“y”结尾 删除“y”并添加“ies”b。如果 名词以“s”、“ch”或“sh”结尾,加上 “es”c。在所有其他情况下,只需添加 “s”打印每个名词及其复数。 尝试以下数据:椅子
奶牛场老板马戏团飞狗 教堂线索盘

到目前为止,我已经掌握了这一点,但它的功能并不像预期的那样:

#include<stdlib.h>
#include <Windows.h>
#include <stdio.h>
#include <string.h>
#define SIZE    8

char *replace_str(char *str, char *orig, char *rep)
{
    static char buffer[4096];
    char *p;
    if(!(p = strstr(str, orig)))
        return str;
    strncpy(buffer, str, p-str);
    buffer[p-str] = '\0';
    sprintf(buffer+(p-str), "%s%s", rep, p+strlen(orig));
    return buffer;
}

int main(void)
{
    char plural[SIZE];
    printf("Enter a noun: ");
    scanf("%c",&plural);
    bool noreplace = false;

    puts(replace_str(plural, "s","es"));
    puts(replace_str(plural, "sh","es"));
    puts(replace_str(plural, "ch","es"));
    puts(replace_str(plural, "y", "ies"));
    if(noreplace) {
    puts(replace_str(plural, "","s"));
    }
    system("pause");
    return 0;
}
#包括
#包括
#包括
#包括
#定义大小8
char*replace_str(char*str,char*orig,char*rep)
{
静态字符缓冲区[4096];
char*p;
如果(!(p=strstrstr(str,orig)))
返回str;
strncpy(缓冲区,str,p-str);
缓冲区[p-str]='\0';
sprintf(buffer+(p-str),%s%s,rep,p+strlen(orig));
返回缓冲区;
}
内部主(空)
{
字符复数[大小];
printf(“输入一个名词:”);
scanf(“%c”和复数形式);
bool-noreplace=false;
puts(替换_str(复数,“s”、“es”);
puts(替换_str(复数,“sh”,“es”));
puts(替换_str(复数,“ch”,“es”));
puts(替换_str(复数,“y”、“ies”);
如果(无替换){
puts(替换_str(复数,“,”s”);
}
系统(“暂停”);
返回0;
}
我已经有一段时间没上C课了,有人能帮我吗?
谢谢。

您将一个单词解读为:

scanf("%c",&plural);
这是不正确的,因为它只读取一个字符

将其更改为:

scanf("%s",plural);
或者更好地使用
fgets
作为:

fgets (plural,SIZE, stdin);
但请注意,
fgets
可能会在字符串末尾添加一个换行符。如果需要,您需要在替换之前删除它,因为替换取决于单词中的最后一个字符


此外,您的更换零件不正确。您正在将任何
s
替换为
es
(与其他替换相同)。您只需更换最后一个
s

您正在阅读的单词:

scanf("%c",&plural);
这是不正确的,因为它只读取一个字符

将其更改为:

scanf("%s",plural);
或者更好地使用
fgets
作为:

fgets (plural,SIZE, stdin);
但请注意,
fgets
可能会在字符串末尾添加一个换行符。如果需要,您需要在替换之前删除它,因为替换取决于单词中的最后一个字符


此外,您的更换零件不正确。您正在将任何
s
替换为
es
(与其他替换相同)。您只需更换最后一个
s

也许这会对您有所帮助:


做得很好

也许这可以帮助您:

做得很好

首先,
scanf(“%c”)
获取单个字符,而不是字符串。为此,您应该使用
fgets
,大致如下:

fgets (plural, SIZE, stdin);
if (buffer[strlen(buffer)-1] == '\n')    // Remove newline if there.
    buffer[strlen(buffer)-1] = '\0';
一旦你解决了这个问题,我们就可以转向这个函数,它可以通过一个合适的测试工具使单词多元化。确保你保留自己的
main
(使用固定的输入法),因为这个工具中有一些东西可能会让你的教育者怀疑它不是你的代码。我只是出于测试的目的把它放在这里

从以下内容开始:

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

char *pluralise(char *str) {
    static char buffer[4096];
    strcpy (buffer, str);
    return buffer;
}

int main(void)
{
    char *test[] = {
        "chair", "dairy", "boss", "circus", "fly",
        "dog", "church", "clue", "dish"
    };
    size_t i;

    for (i = 0; i < sizeof(test)/sizeof(*test); i++)
        printf ("%-8s -> %s\n", test[i], pluralise (test[i]));

    return 0;
}
下一步是了解如何检测特定的结尾,以及如何复制和修改字符串以适应

字符串是以下形式的字符数组:

  0   1   2   3   4   5
+---+---+---+---+---+---+
| c | h | a | i | r | $ |
+---+---+---+---+---+---+
其中,
$
表示空终止符
\0
。上面的数字给出了从开始的偏移量或索引,您可以使用该索引从该数组中的特定位置获取字符。所以
str[3]
会给你
i

使用该值和字符串的长度(
strlen(str)
将为您提供5),您可以检查特定字符。您还可以将字符复制到目标缓冲区,并使用类似的方法修改结尾

就像任何一个优秀的毒贩一样,我将免费给你第一次打击:-)

特别令人感兴趣的是以下顺序:

strcpy (buffer, str);
strcpy (&(buffer[sz-1]), "ies");
第一行是字符串的精确副本,如:

  0   1   2   3   4   5
+---+---+---+---+---+---+
| d | a | i | r | y | $ |
+---+---+---+---+---+---+
第二行将
“ies”
字符串复制到
缓冲区[sz-1]
的内存位置。由于
sz
为5,因此偏移量为4,导致以下变化:

  0   1   2   3   4   5
+---+---+---+---+---+---+
| d | a | i | r | y | $ |
+---+---+---+---+---+---+---+---+
                | i | e | s | $ |
                +---+---+---+---+
这样你就有了
奶牛场

因此,您应该能够使用相同的方法检测其他字符串结尾,并执行类似的复制/修改操作以正确地多元化字符串。

首先,
scanf(“%c”)
获取单个字符,而不是字符串。为此,您应该使用
fgets
,大致如下:

fgets (plural, SIZE, stdin);
if (buffer[strlen(buffer)-1] == '\n')    // Remove newline if there.
    buffer[strlen(buffer)-1] = '\0';
一旦你解决了这个问题,我们就可以转向这个函数,它可以通过一个合适的测试工具使单词多元化。确保你保留自己的
main
(使用固定的输入法),因为这个工具中有一些东西可能会让你的教育者怀疑它不是你的代码。我只是出于测试的目的把它放在这里

从以下内容开始:

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

char *pluralise(char *str) {
    static char buffer[4096];
    strcpy (buffer, str);
    return buffer;
}

int main(void)
{
    char *test[] = {
        "chair", "dairy", "boss", "circus", "fly",
        "dog", "church", "clue", "dish"
    };
    size_t i;

    for (i = 0; i < sizeof(test)/sizeof(*test); i++)
        printf ("%-8s -> %s\n", test[i], pluralise (test[i]));

    return 0;
}
下一步是了解如何检测特定的结尾,以及如何复制和修改字符串以适应

字符串是以下形式的字符数组:

  0   1   2   3   4   5
+---+---+---+---+---+---+
| c | h | a | i | r | $ |
+---+---+---+---+---+---+
其中,
$
表示空终止符
\0
。上面的数字给出了从开始的偏移量或索引,您可以使用该索引从该数组中的特定位置获取字符。所以
str[3]
会给你
i

使用该值和字符串的长度(
strlen(str)
将为您提供5),您可以检查特定字符。您还可以将字符复制到目标缓冲区,并使用类似的方法修改结尾

就像任何一个优秀的毒贩一样,我将免费给你第一次打击:-)

特别令人感兴趣的是以下顺序:

strcpy (buffer, str);
strcpy (&(buffer[sz-1]), "ies");
第一行是字符串的精确副本,如:

  0   1   2   3   4   5
+---+---+---+---+---+---+
| d | a | i | r | y | $ |
+---+---+---+---+---+---+
第二行将
“ies”
字符串复制到
缓冲区[sz-1]
的内存位置。自<