【问题标题】:Copying chars in C在 C 中复制字符
【发布时间】:2017-08-09 07:14:24
【问题描述】:

我正在开发一种凯撒密码程序来弄脏我的手,但我被以下代码卡住了:

char * encrypt(char *input) {
    int length = strlen(input);
    char *encrypted;

    encrypted = malloc(length+1);
    encrypted[0] = 0;

    int i;
    for(i=0; i < length; i++) {
        printf("%c\n", input[i]);
        if (i>0) {
            encrypted[i] = input[i];
        }
    }

    encrypted[length] = '\0';
    printf("Encrypted: %s\n", encrypted);
    return encrypted;
}

现在我只是想弄清楚为什么我无法为 char 复制输入字符。末尾的加密字符串显示为空。但是,charprintf 语句会产生正确的值。

代码有什么问题?

【问题讨论】:

  • 删除encrypted[0] = 0并删除if (i &gt; 0)
  • 请描述在问题中您看到的行为以及与您的预期有何不同。
  • 用C编译并运行一个hello world示例后首先要学习的是如何使用调试器。在调试器的帮助下,您将能够发现 c 字符串是 0 终止的。由于您的行 encrypted[0] = 0 以及您从未在循环中更改该值 (if(i &gt; 0)...) 的事实,您会在最后一个 printf 输出中看到一个空字符串。
  • 感谢大家的帮助!我以为我读过我必须在第一个元素上用 0 初始化数组。在重新阅读了我的 C 书之后,我现在意识到我误读了那部分。再次感谢!

标签: c arrays string pointers char


【解决方案1】:

您没有复制字符串的第一个字符(在索引 0 处)。您确实将该字符设置为 0 (NUL),因此当您将 encrypted 打印为字符串时,它看起来的长度为零。

删除if (i&gt;0) 测试并无条件复制字符。您还可以删除 encrypted[0] = 0; 行,因为您将用字符串的第一个字符覆盖它。

【讨论】:

    【解决方案2】:

    你已经得到了答案,只是为了详细说明期望部分,让我加两分钱。

    引用C11,第7.21.6.1 章,对于%s 转换说明符,使用printf(),预期的参数类型是

    s

    如果不存在l 长度修饰符,则参数应为指向初始值的指针 字符类型数组的元素。数组中的字符是 写到(但不包括)终止空字符。 [...]

    所以,如果第一个元素在 null 中,它就会停在那里。

    换句话说,C 风格的字符串 的定义来自C11,第 7.1.1 章

    字符串是一个连续的字符序列,以第一个 null 结尾(包括第一个 null) 特点。 [....]

    所以,归根结底,每当你使用一个你希望是一个字符串的数组时,你需要确保

    • 数组中有一个空终止符
    • “必需”数据出现在空终止符之前。

    例如,根据定义,内容如“abc\0def\0”的数组是一个完全有效的字符串,但它可能不符合您的要求,因为“def”部分将是没有函数处理需要 string,因为在此之前有一个 null 终止符,它们在那里停止处理。


    现在,在遍历每个元素时,您不再依赖空终止符,因此(只要您在数组范围内),您将获得所有单个元素的正确值。

    【讨论】:

      【解决方案3】:

      似乎是空的,因为你有一个 NUL 终止符作为第一个元素。你真的想要encrypted[0] = 0;if (i &gt; 0) {吗?

      所以 C 风格的字符串输出函数不会打印任何字符串。

      【讨论】:

        【解决方案4】:
        if (i>0) {
                      encrypted[i] = input[i];
        

        问题就在这里,你的 if 应该是这样的

         if (i>=0) {
                     encrypted[i] = input[i];
        

        这个if没有太大意义

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-18
          • 1970-01-01
          • 2013-01-29
          • 2011-11-21
          • 2017-01-29
          • 2020-06-29
          相关资源
          最近更新 更多