【问题标题】:intermix command line strings in C在 C 中混合命令行字符串
【发布时间】:2016-07-05 05:06:38
【问题描述】:

这是作业,所以我不是在寻找直接的答案,而是更多地寻找这背后的逻辑。我不认为这个问题对于新手 C 开发人员来说说得很好,我在这里找不到任何资源来帮助我。我是 C 的新手,更像是一个 Java 人,所以这看起来完全和完全没有意义。说明如下

  • $ ./mixedupecho 你好!
  • .H/EmLiLxOe!dHuEpLeLcOh!oH *
  • 对于此程序,您可以忽略前两个以外的任何命令行参数(包括程序名称本身):
  • $ ./mixedupecho 你好!更多啦啦啦
  • .H/EmLiLxOe!dHuEpLeLcOh!oH *
  • 注意“你好!”比“./mixedupecho”短,所以程序“环绕”
  • 并在到达字符串末尾时从“H”重新开始。 *
  • 如何实现?模 % 运算符是您的朋友。
  • 特别注意,“HELLO!”[5] 产生 '!',而“HELLO!”[6] 超出了数组的范围。
  • 但“HELLO!”[6 % 6] 的计算结果为“HELLO!”[0],结果为“H”。
  • “HELLO!”[7 % 6] 计算结果为“HELLO!”[1] ...

下面是我到目前为止的代码。这会遍历我得到的 argv 字符串的每个字符。我没有得到的是如何打印它而不是序列 [0][0], [0][1], [0][2]... 我得到 [0][0], [ 1][0]、[0][1]...等

有人可以向我解释一下吗?

int main(int argc, string argv[])
{
for(int i = 0; i < argc; i++)
{

    for(int j = 0, n = strlen(argv[i]); j < n; j++)
        {
            printf("%c", argv[i][j]);
        }
}
printf("\n");

}

非常感谢!这让我发疯了!

【问题讨论】:

  • 在我看来像是随机垃圾邮件。更新:嗯,不。乍一看。但是写描述的人脑子里一团糟。
  • “非常感谢!这让我发疯了!” - 不要说显而易见的。 (SCNR)
  • 我想知道提供此类作业的机构名称。
  • 这是LaunchCode赞助的cs50课程。
  • 提示 #1:main 应该定义为:int main(int argc, char **argv);提示 #2:argv[0] 是程序的名称...如果您只打印命令行参数,您是否也应该包含程序的名称?

标签: c command-line-arguments


【解决方案1】:

您希望保持索引i 递增,直到它等于最长字符串中空终止符的索引。同时,您将使用% 运算符来确保i 保持在较短字符串的边界内。

我会这样做:

  1. 将初始(无符号)长度设置为-1U,以避免不必要地计算长度。我将在此示例的其余部分使用 LIMIT,就像我使用 #define LIMIT -1U 一样。
  2. 遍历字符串,检查以确保argv[N][i] % len[N] 不是空终止符。如果是空终止符和len[N] == LIMIT,则设置len[N] = i
  3. 当表达式len[0] != LIMIT &amp;&amp; len[1] != LIMIT 为真时,循环结束,因为两个字符串都具有正确的长度,这意味着每个字符串中的所有字符都已被枚举。

剩下的唯一事情就是打印每个字符串的字符,我相信你可以处理。我会使用0 作为初始长度,除了因为你不能做x % 0 会使事情复杂化。无符号长度的原因是 -1U 导致 unsigned int 值(例如 4294967295 或 65535);普通的-1 得到x % -1,这是没有意义的,因为除以-1 不会产生余数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-10
    • 2017-08-31
    • 2021-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-01
    相关资源
    最近更新 更多