【问题标题】:Making custom tr.c function制作自定义 tr.c 函数
【发布时间】:2015-02-05 19:04:52
【问题描述】:
void tr_str(char s[], char news[]){
int c;
size_t k =0;
    while ((c = getchar()) != EOF)
    {
        for(k=0; k < strlen(s);k++)
        {                   
            if(c == s[k])
            {
                c = news[k];
            }
        }
        putchar(c);
    }
}

这是我的翻译功能,目前从命令行接收两个参数,并使用这些字母将第一组切换到第二组。我刚刚发现一个问题,如果两个参数的长度不同,它就不起作用。必须发生的是,如果第一个参数是 3 个字符长度,第二个是 2 个字符长度,则第二个参数会添加第三个字符,它应该等于存储在其中的最后一个字符。例如:arg1(a,b,c); arg2(x,y);使用时 arg2 变为 arg2(x,y,y);

感谢您的帮助。

【问题讨论】:

  • 看看strstr(), strchr(), strspn()?
  • 这些函数都不是理想的,因为你真的想要一个函数是size_t indexof(char *haystack, int needle),但你得到的最好的是char *strchr(char *haystack, int needle),所以你需要通过减去指针来计算索引。跨度>
  • 我有点明白你在说什么。指针的数量显示数组中存储了多少实际值对吗?使用它我想我可以制作一个循环来用最后出现的字符填充剩余空间。有没有一个函数可以获取字符串最后出现的字符?

标签: c io tr


【解决方案1】:

如果你只是想让你的代码工作而不做任何优化,你必须在选择新闻中的字符之前将 k 与 strlen(news) 进行比较。它假定新闻至少有一个字符。

void tr_str(char s[], char news[]){
int c;
size_t k =0;
    while ((c = getchar()) != EOF)
    {
        for(k=0; k < strlen(s);k++)
        {                   
            if(c == s[k])
            {
                if (k >= strlen(news))
                    c = news[strlen(news) - 1)];
                else
                    c = news[k];
                break; // Need a break here, else c could be found again in s and translated again.
            }
        }
        putchar(c);
    }
}

重复 news 中的最后一个字符以防止循环中的重复测试是个好主意,但您不应该直接修改 news[],除非您确定在每种情况下 news 都在一个足够大的可写内存中,即使那样,IMO 仍然是不好的做法。制作新闻副本并使用它会更好。

void tr_str(char s[], char news[]){
int c;
size_t k = 0;
size_t sSize = strlen(s);
size_t newsSize = strlen(news);
char *newsCopy;
int preventsMemoryLeak = 0;

    if (newsSize < sSize)
    {
        // Duplicates news in a large enough memory. No need a zero at end of this copy.
        newsCopy = malloc(sSize);
        memcpy(newsCopy, news, newsSize);
        // Fills the remaining with a copy of the last char
        memset(newsCopy + newsSize, news[newsSize - 1], sSize - newsSize);

        preventsMemoryLeak = 1;
    }
    else
    {
        newsCopy = news;
    }

    while ((c = getchar()) != EOF)
    {
        for(k = 0; k < sSize; k++)
        {                   
            if(c == s[k])
            {
                c = newsCopy[k];
                break;
            }
        }
        putchar(c);
    }

    if (preventsMemoryLeak == 1) free(newsCopy);
}

【讨论】:

    猜你喜欢
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-08
    • 1970-01-01
    • 2020-12-07
    • 1970-01-01
    • 2011-10-02
    相关资源
    最近更新 更多