【问题标题】:Why is the for printf in this C function not outputting the correct string?为什么这个 C 函数中的 for printf 没有输出正确的字符串?
【发布时间】:2021-09-19 11:11:00
【问题描述】:

我正在尝试编写一个输出输入字符串 10 次的函数。这是代码。

#include <stdio.h>

int print10times(){

    char input[] = "";
    printf("Which string would you like to print 10 times? ");
    scanf("%s", input);

    for (int i=0; i<10; i++){
        printf("%s\n", input);
    }

    return 0;
}

int main(){

    print10times();
    return 0;
    
}

我得到的输出如下所示:

Which string would you like to print 10 times? Hello
H
H☺
H☻
H♥
H♦
H♣
H♠
H
H
H

有人可以告诉我为什么这不会打印 10 次“Hello”吗?

谢谢。

【问题讨论】:

  • 问题不是 printf - 由于缓冲区溢出,您的 scanf 是 UB。我找不到确切的重复问题,但一些高级信息位于 stackoverflow.com/questions/1621394/…
  • 为输入准备更多空间。喜欢char input[50]。和scnaf("%49s", input)
  • @ianfun 谢谢,在 input[] 中输入一个值就可以了。只是好奇,默认情况下,没有值的 char 声明有多少空间?此外,当我像原来的那样拥有 char input[] 时,我可以在 for 循环之外打印整个“Hello”字符串。你知道这是为什么吗?
  • 您的声明 char input[] = ""; 为最多 0 个字符的字符串分配了空间。 :-) (加上尾随 \0 字节,因此数组的总大小为 1。)
  • "我可以在 for 循环之外打印整个“Hello”字符串。你知道这是为什么吗?。读/写无效内存是未定义的行为。UB 表示结果是不可预测的,包括崩溃、错误值、似乎“工作”等。How dangerous is it to access an array out of bounds?

标签: c printf scanf


【解决方案1】:

你必须给 input[] 更多的空间,因为 char input[]="";如您所知,char 仅占用 1 个字节,因此在这种情况下,它仅读取“hello”okk 的 h,因为已经有一个称为 null 字符的字符,如果您想在运行时分配内存,它也会消耗空格,以便您可以使用动态内存函数。 . 总体只需替换 char input[]="";带字符输入[50];简单.....

【讨论】:

    【解决方案2】:

    您声明char input[] = "";,这使得input 成为长度为1 的字符串(仅包含终止'\0')。当您尝试向其中读取超过零个字符时,它不会神奇地增长,而是您将访问它后面的内存(可能会破坏其内容、崩溃或更糟)。

    例如,改为将其声明为 char input[80] = "";,您最多可以有 79 个字符的空间。这仍然是一个潜在的问题,因为您键入的输入可能会更长,但它最多可以处理 79 个字符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-28
      • 2019-06-28
      • 2020-01-10
      • 2015-01-13
      • 1970-01-01
      相关资源
      最近更新 更多