【问题标题】:C strings giving weird outputs给出奇怪输出的 C 字符串
【发布时间】:2020-05-07 15:52:01
【问题描述】:

(1)

#include<stdio.h>
int main()
{
    char str[5]="hello";
    str[5] = "g";
    printf("%s",str);
    return 0;
}

输出:你好0
这不应该给出错误吗?

(2)

#include<stdio.h>
int main()
{
    char str[5]="hello";
    str[3] = "g";
    printf("%s",str);
    return 0;
}

输出:hel0o
0是从哪里进来的?

编译器:TDM-GCC-64
视窗 10
编辑器:Sublime Text

【问题讨论】:

  • C 不检查数组边界。你必须自己处理。
  • 如果您的编译器没有抱怨,请将警告级别调高(最大)。除了越界访问之外,类型不匹配
  • char str[5]="hello"; 没有字符串终止符,因此将它传递给期望一个字符串的函数是未定义的行为。 C 没有必须出错,就像你不会不看就被碾过马路。

标签: c output


【解决方案1】:

我在给定的代码中看到多个错误。

1- 在 C 语法中尝试分配双引号值返回一个指针值,其值是该字符串的第一个索引的地址。

通过做

    str[3] = "g";

您只是要求编译器在 RAM 的某处键入“g”并返回该“g”的地址并将该值分配给 str[3]。由于 C 不是类型安全的,因此编译器会自动将该指针转换为 char,结果通常不会很好。

我认为你真正想做的是 str[3] = 'g' 。这样您的输出将是 helgo

2- 你不应该尝试到达 并且绝对不要修改 超出字符串的范围。您最终会遇到分段错误,或者基于您的编译器/操作系统的任何等效错误。 str[5]=x 不是你想要的,除非你的 str 的大小至少为 6。

3- 在 C 中,当您将 %s 用于 printf 或类似函数时,它会从您提供的指针开始在屏幕上显示值(数组名称实际上是常量指针),直到它看到 0。我不知道t 表示实际值为 48 的字符 0('0')。文字 0。例如,尝试 str[1]=0,在您的 printf 中它只会显示 h

【讨论】:

    【解决方案2】:

    您应该已经注意到您分配给str[3] 的值是一种字符串,而不是字符。如果您使用str[3] = 'g',您应该不会再收到错误消息。

    考虑以下代码:

    #include <stdio.h>
    
    int main(void) {
        char str[5] = "hello";
        str[3] = 'g'; // "g" != 'g'
    
        printf("%s\n", str);
    
        return 0;
    }
    

    【讨论】:

      【解决方案3】:
      1. 这不应该报错吗?

      当您尝试写入超出数组范围时,编译器不会检测到。

      但除此之外,str[5] = "g"; 会发出警告:

      警告:从 'char *' 赋值给 'char' 使指针变成整数而不需要强制转换 [-Wint-conversion]

      由于您将字符串分配给char 的元素,因此其行为和输出是未定义的。

      1. 0 是从哪里来的?

      例子:

      char str[5]="hello";
      str[3] = "g";
      

      注意"g" 是一个字符串,而不是像'g' 这样的字符常量。字符串总是有一个终止空字符。这个空字符被写入str的第5个元素中。

      除此之外,当您使用相同的错误语句str[3] = "g"; 时,此处的行为也未定义。


      你需要的是:

      #include <stdio.h>
      
      int main(void)
      {
          char str[6] = "hello";
          str[3] = 'g';
          printf("%s", str);
          return 0;
      }
      

      输出:

      helgo
      

      【讨论】:

        猜你喜欢
        • 2014-08-26
        • 2021-04-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多