【问题标题】:while loop is not breakingwhile 循环没有中断
【发布时间】:2017-03-19 20:10:16
【问题描述】:

我无法找出以下代码行为不当的原因。这是一个接受字符的简单代码,直到输入 * 或达到数组大小,然后打印从键盘读取的字符。看起来阅读部分很好。此外,如果我在达到数组大小之前输入 * 一切都很好。但是如果我不输入 * 并等到读取部分达到数组大小,我就有麻烦了。打印时会打印读取的字符,但之后会打印一些垃圾。运行调试器,但当 index 为 3 或更大时,while 循环不会中断。

int main()
{
    char myStr [3];
    unsigned int index=0;
    printf("Enter Single characters. Enter * to stop\n");
    do
    {
        scanf(" %c",&myStr[index]);
        index++;
    } while ((myStr[index-1]!='*')&&((index)<(sizeof(myStr)/sizeof(myStr[0]))));

    index=0;

    while ((myStr[index]!='*')&&(index<(sizeof(myStr)/sizeof(myStr[0]))))
   {
        printf("%c",myStr[index]);
        index++;
    }
    printf("\n");

    return(0);
}

【问题讨论】:

  • Sizeof mystr 是通过声明它 [3] 来修复的,也许?在那种情况下,您的商将不代表数组中实际字符的数量?
  • @JeremyKahan:在数组上执行sizeof(myStr)/sizeof(myStr[0]) 完全可以计算元素的数量。
  • @alk 是的,但我担心无论用户是否输入三个元素,都会出现三个元素。但我现在明白这无关紧要,因为用户要么输入星星,要么必须输入 3。
  • 注意:您可以使用 for() 循环来简化循环逻辑。

标签: c arrays while-loop do-while sizeof


【解决方案1】:

代码在printf 循环的最后一次迭代中遇到未定义的行为

    while ((myStr[index]!='*')&&(index<(sizeof(myStr)/sizeof(myStr[0]))))
    {
      ...

事实上是这样的

    while ((myStr[3] ....

myStr[3] 访问 myStr 越界。

要解决这个问题:

    while ((index < (sizeof(myStr)/sizeof(myStr[0]))) && (myStr[index] != '*'))

Boolean short-circuiting 将处理 myStr[3] 不被执行。

【讨论】:

  • 感谢您的精彩分析。出现越界值的未定义行为:我知道 myStr[4] 可能是垃圾值。但它仍然应该有一些价值(我认为),因为它肯定指向某个内存位置。在这种情况下,第一部分可能评估为 TRUE 或 FALSE。在这种情况下,代码应该表现正确。但是我从来不知道仅仅读取一个不重要的内存可能会导致应用程序的完全错误行为。如果我写入超出范围的内存,我可以理解系统的未定义行为。
  • 澄清:当 index=3 时,while 循环无论如何都不会进入,因为第二部分变为 FALSE。所以 printf() 没有出现对吗?
  • 修复了索引从 4 到 3 ... :}
【解决方案2】:

您正在操作字符串,女巫需要以空值结尾。 您应该使用 fgets(3) 来获取您的字符串,然后使用 strlen(3) 来获取长度。 然后你可以在你的字符串中移动 而 (str[i] != '*' && i

【讨论】:

  • "您正在操作字符串 ..." 不,OP 使用 char-array,仅此而已。周围没有 C-“字符串”,也没有任何依赖 char-arrays 的函数被用作 C-“字符串”。
  • 我的错,我看到了一个字符*
  • 指向charchar*)的指针会如何改变?
猜你喜欢
  • 2017-01-05
  • 1970-01-01
  • 2023-02-03
  • 1970-01-01
  • 2020-10-04
  • 2017-11-14
  • 2019-05-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多