C中的字符串替换?

时间:2011-03-24 07:05:41

标签: c

  

编写一个带名词和的程序   在此基础上形成复数形式   这些规则:a。如果名词以“y”结尾   删除“y”并添加“ies”b。如果   名词以“s”,“ch”或“sh”结尾,加   “退出。在所有其他情况下,只需添加   “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;
}

我有一段时间没有参加过C课可以帮助我吗? 感谢。

6 个答案:

答案 0 :(得分:3)

你正在读一个单词:

scanf("%c",&plural);

这是不正确的,因为它只读取一个字符。

将其更改为:

scanf("%s",plural);

甚至更好地使用fgets作为:

fgets (plural,SIZE, stdin);

但请注意fgets可能会在字符串末尾添加换行符。如果是,您需要在更换之前将其删除,因为您的替换取决于单词中的最后一个字符。

您的更换部件也不正确。您正在使用s替换任何es(与其他替换相同)。您只需要替换最后 s

答案 1 :(得分:2)

首先,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;
}

这基本上只是让你准确回到你传入的内容,但这是一个好的开始:

chair    -> chair
dairy    -> dairy
boss     -> boss
circus   -> circus
fly      -> fly
dog      -> dog
church   -> church
clue     -> clue
dish     -> dish

下一步是了解如何检测特定结尾以及如何复制和修改字符串以适应。

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

  0   1   2   3   4   5
+---+---+---+---+---+---+
| c | h | a | i | r | $ |
+---+---+---+---+---+---+

其中$表示空终止符\0。上面的数字给出了从开始或索引的偏移量,您可以使用该索引从该数组中的特定位置获取字符。因此str[3]将为您提供i

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

就像任何一个好的药物推动者一样,我会免费给你第一个打击: - )

char *pluralise(char *str) {
    static char buffer[4096];
    size_t sz = strlen (str);                // Get length.
    if (sz >= 1) {                           // Only try this if long enough.
        if (str[sz-1] == 'y') {              // Is last character 'y'?
            strcpy (buffer, str);            // Yes, copy whole buffer.
            strcpy (&(buffer[sz-1]), "ies"); // Overwrite from last character.
            return buffer;                   // Return it.
        }
    }
    strcpy (buffer, str);                    // If none match,
    strcat (buffer, "s");                    //   just add "s"
    return buffer;                           //   and return it.
}

特别感兴趣的是序列:

strcpy (buffer, str);
strcpy (&(buffer[sz-1]), "ies");

第一行生成字符串的精确副本,如:

  0   1   2   3   4   5
+---+---+---+---+---+---+
| d | a | i | r | y | $ |
+---+---+---+---+---+---+

第二行将"ies"字符串复制到buffer[sz-1]的内存位置。由于sz为5,因此会偏移4,从而导致以下更改:

  0   1   2   3   4   5
+---+---+---+---+---+---+
| d | a | i | r | y | $ |
+---+---+---+---+---+---+---+---+
                | i | e | s | $ |
                +---+---+---+---+

这样您最终会得到dairies

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

答案 2 :(得分:0)

puts(replace_str(plural, "ch","es"));

考虑输入:church

strstr(3)会找到第一个ch,而不是最后一个ch。糟糕!

此外,一旦您修改replace_str()以找到最后一个ch,您仍然会将其删除,而不是将其重新放回:chures。 (假设你的replace_str()函数正如我认为那样;那是一些毛茸茸的代码。:)所以重新添加ch

puts(replace_str(plural, "ch","ches"));

答案 3 :(得分:0)

首先,您需要找到最后发生的位置,然后调用replacestr()函数 其次是scanf(“%s”,&amp;复数);或者使用fgets()

答案 4 :(得分:0)

strstr找到另一个字符串中第一个出现的字符串。你的任务说要检查目的。所以你需要从你想要找到的字符串的长度向后移动并比较它然后替换它。

答案 5 :(得分:-1)

也许这可以帮到你: str_replace

很好!