【问题标题】:Replacing Characters in C替换 C 中的字符
【发布时间】:2012-09-02 18:29:16
【问题描述】:

这是lab assignment的一部分

我必须实现以下功能...

void replaceChar(char s[], char c,int len)

说明:s 的每个字符替换为clen表示s的长度。

我将此提交给我的班级使用的自动评分器,它告诉我“替换字符串的长度不同。”我已经对此进行了广泛的测试,没有发现任何问题。这是我的完整功能:

void replaceChar(char s[], char c, int len) {
    printf("\n");
    for (int i = 0; i < len; i++) {
        s[i] = c;
        printf("%c",s[i]);
    }
}

感谢您能给我的任何帮助!

以下是我的一些测试用例:

char s1[5] = {'h','e','l','l','o'};

char s3[10] = {'h','e','l','l','o',' ','h','i','i','i'};
char rep1 = 'x';
replaceChar(s1,rep1,5);
replaceChar(s3,rep1,10);

【问题讨论】:

  • len 传递什么?
  • 可以和老师或助教谈谈吗?
  • 我怀疑你误解了 len 参数
  • @MattAltepeter 您是否尝试过明确标记 NUL 终止符? s[len] = '\0';
  • 谢谢@oldrinb!我在循环之后添加了它并重新提交它并删除了错误!非常感谢!

标签: c character-replacement


【解决方案1】:

my comment:

您是否尝试过明确标记 NUL 终止符? s[len] = '\0';

虽然这解决了问题,但我仍然会与您的教授联系并询问他们为什么首先需要这样做。实验室未指定字符串 s 需要以 NUL 结尾。

顺便说一句(最初在another of my comments 中提到),您应该在初始化s1s3 时利用字符串文字,即

char s1[] = "hello";
char s3[] = "hello hiii";

这不仅看起来更简洁(并且避免了明确提及数组长度的需要),而且还保证了字符串也是以 NUL 结尾的。

【讨论】:

  • s[len] = '\0' 超出了规范。很有可能将字符串内部的指针或非 NUL 终止的缓冲区传递给 replaceChar。这里的错误实际上与测试框架有关,而不是 OP 的 replaceChar 实现。
  • @JimBalter 我说规范没有必要,他应该问他的教授(见¶2)。 PS你说的a pointer internal to a string是什么意思?
  • Jim Balter 是对的,因为 s 可以指向更大的 char[]。 NULL 终止函数中的字符串永远不应该这样做。它使整个功能无用。 char[] 是否为 NULL 终止取决于向您发送指向它的指针(偏移与否)的人,并且该函数不应更改它。如果它不是以 NULL 结尾的(例如,基本上传递了一个子字符串),它应该不以 NULL 结尾,而不是通过有效地将字符串截断为 s+len 来完成字符串。这里使用的测试框架令人震惊,而且问题也不清楚。
  • @oldrinb len 在哪里定义为 NULL 字符之前的长度?你可以通过连接不相关的函数来实现飞跃,但字面意思并没有具体说明。查看评分标准,它说:replaceChar() - 用提供的字符替换字符串 s 的每个字符,长度不超过 n。 按照该技术定义,您的解决方案超出了它的范围。是的,s 是一个字符串。我们知道 n/len 在哪里结束吗?我们怎么知道它把我们带到了终点,而不是中间?您的解决方案技术上用 c... 替换字符串 s 的每个字符直到 n...然后用 NULL 替换 s[len]。
  • 另外,澄清一下,我认为您的解决方案正是他们正在寻找的(够愚蠢的),我只是认为规范可能会更清晰,因为通常您不会假设你应该只添加一个NULL。认为你不需要它是很自然的。在现实生活中,你什么时候添加它?它降低了函数的有用性。编辑:另外,为什么他的版本失败了?如果测试框架按照它所说的那样传递了一个字符串,那么在其中不粘贴 NULL 不会改变长度; s 最后应该已经包含一个。令人困惑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-30
  • 1970-01-01
  • 1970-01-01
  • 2011-06-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多