c中循环问题的特殊字符读取

时间:2017-07-23 08:31:30

标签: c for-loop gcc char

我的情况是我需要输入一些字符,在读完一个特定字符后(这里*)我需要突破循环。

代码:

void main()
{
    int i=0,temp=0;
    char a[100];
    printf("Enter the array\n");

    for(i=0;a[i]!='*';i++)
    {
        scanf("%c",&a[i]); 
    }
}

即使我输入了' *'它没有出现在循环中。

我更改了如下所示的代码,它可以正常工作。

void main()
{
    int i=0,temp=0;
    char a[100];

    printf("Enter the array\n");

    for(i=0;;i++)
    {
       scanf("%c",&a[i]);
       if(a[i]=='*')
           break;
    }
}

第一个代码有什么问题? 我正在使用gcc编译器。

3 个答案:

答案 0 :(得分:3)

using UnityEngine;

using System.Collections;

public class ExampleClass : MonoBehaviour {

    void OnCollisionEnter2D(Collision2D coll) {
        if (coll.gameObject.tag == "Enemy")
            coll.gameObject.SendMessage("collided", 10);

    }
}

使用与此声明中使用的void main() { int i=0,temp=0; char a[100]; printf("Enter the array\n"); for(i=0;a[i]!='*';i++) { scanf("%c",&a[i]); } } 相同的值来执行测试a[i]!='*'

i

在扫描和测试之间 scanf("%c",&a[i]); 递增。

序列是:

  1. i设为i
  2. 如果0不小于i ,则
  3. 离开循环
  4. 针对100
  5. 测试a[0]
  6. 扫描到*
  7. 增量a[0]
  8. 如果i不小于i ,则
  9. 离开循环
  10. 针对100
  11. 测试a[1]
  12. 扫描到*
  13. 增量a[1]
  14. 如果i不小于i ,则
  15. 离开循环
  16. 等......
  17. 从上面你还可以了解到,代码在之前测试了100的元素,它们获得了任何值。这样做会引发臭名昭着的未定义行为,这是一件坏事,因为从任何可能发生的那一刻起。

答案 1 :(得分:1)

这是因为循环在循环执行内部语句之前评估条件

所以,它是这样的:

  1. 我们有一个柜台
  2. 检查条件
  3. 执行循环语句
  4. 计数器递增
  5. 因此,在您输入之前,循环已经检查了“*”。

答案 2 :(得分:0)

问题是class B { callAComponent:function(res) { this.props.callback(res) } render{ return( <input type="text" onChange={this.callAComponent}//whaever event you are performing ) } } 语句在评估for循环退出条件之前运行i++增量。如果你在valgrind下运行你的程序,这是一个跟踪未初始化内存的内存调试器,这是非常明显的:

a[i] != '*'

(第一次未初始化的内存访问在读取任何字符之前发生,因为在第一次循环执行之前也会检查循环退出条件。)