【问题标题】:C Primer Plus Chapter 6 Exercise 4C Primer Plus 第 6 章练习 4
【发布时间】:2017-12-25 06:12:01
【问题描述】:

使用嵌套循环产生以下内容

A
BC
DEF
GHIJ
KLMNO
PQRSTU

这是我目前所拥有的。我最终得到了一个令人讨厌的运行时错误。

#include <stdio.h>

int main(void) {

    int row;
    char let;
    char ch = 'A';

    for (row = 1; row <= 6; row++) {

        for (let = ch; let < (let + row); let++) {

            printf("%c", let);

        }

        ch = let;
        printf("\n");

    }

    return 0;
}

我现在不确定该怎么做。错误是由于 信没有更新?

【问题讨论】:

  • @segarci ,OP 提到他得到一个运行时错误
  • @CoolGuy - 运行时错误有多种形式
  • “现在还不确定该做什么” - 调试将是一个很好的起点。这个你甚至不需要正式的调试器。一支铅笔、一张纸和三列会很快显示车轮脱落的位置。
  • @EdHeal ,您的意思是一旦出现运行时错误,任何事情都可能发生?
  • @CoolGuy - 我没有这么说。运行时错误可能是内存不足、堆栈溢出、浮点溢出、内存泄漏……

标签: c runtime-error


【解决方案1】:

您的循环永远不会中断,因为条件 let &lt; (let + row); 始终为真!例如提示:1 &lt; (1 + i)怎么可能??

【讨论】:

  • 这取决于他的编译器是否提供有符号或无符号char 类型。 C 标准没有规定。
【解决方案2】:

改变

for (let = ch; let < (let + row); let++)

for (let = ch; let < (ch + row); let++)

否则,你会得到一个无限循环,因为let &lt; (let + row) 永远不会是假的。这可能因编译器而异。 C 标准没有指定 letunsigned char 还是 signed char。所以由编译器决定。

如果letunsigned char,则循环将循环并最终,(let+row) 将环绕(由于溢出)到值 0,然后循环结束。
如果letsigned char,那么最终,(let+row) 将溢出并且可以保存任何值。这会导致未定义的行为,并且无法保证循环是否会结束。

【讨论】:

  • 这取决于他的编译器是否提供有符号或无符号char 类型。 C 标准没有指定。
  • @BenVoigt ,所以如果letunsigned char,那么循环将很快结束,如果letsigned,那么它将是UB?
【解决方案3】:

这是位吗

let < (let + row)

会永远是真的吗?

【讨论】:

  • 这取决于他的编译器是否提供有符号或无符号char 类型。 C 标准没有指定。
【解决方案4】:

改成

for (let = 0; let <  row; let++) {
    printf("%c", ch + let);
}
ch += let;

【讨论】:

  • 你应该详细说明OP问题。
猜你喜欢
  • 1970-01-01
  • 2018-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-20
  • 2015-02-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多