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);
感谢您的帮助。
最佳答案
如果您只是想让代码正常工作,而不进行任何优化,则必须在选择 news 中的字符之前将 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 都位于可写的足够大的内存中,即使如此,在我看来这仍然是不好的做法。复制新闻并使用它会更好。
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);
}
关于c - 制作自定义 tr.c 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28351989/