虽然循环没有破坏

时间:2016-11-06 11:48:30

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

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

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);
}

2 个答案:

答案 0 :(得分:2)

代码在<div class="form-group" ng-class="{'has-error':Form.jobtype.$dirty && Form.jobtype.$invalid, 'has-success':Form.jobtype.$valid}"> <label class="control-label" translate="jobdata.joblist.title"> Types of job </label> :<br/> <div ng-repeat="topic in mylist.jobdata.joblist.jobitems"> <div > {{topic.item}}</div> <ul > <li ng-repeat="subitem in topic.subitems"> <input type="checkbox" name="jobtype" ng-disabled="shouldDisable(subitem.key)" ng-model="myModel.mychosenjobs[subitem.key]"> {{subitem.values | translate}} </li> </ul> </div> <div class="form-group" ng-class="{'has-error':Form.myfreetext.$dirty && Form.myfreetext.$invalid, 'has-success':Form.myfreetext.$valid}"> <p>or type it in yourself:</p> <textarea type="text" class="form-control" name="myfreetext" placeholder="Enter the cooperation type (max of 100 characters)" ng-disabled="shouldDisable('freetext')" ng-model="myModel.mychosenjobs.freetext" ng-minlength="5" ng-maxlength="100"></textarea> <span class="error text-small block" ng-if="Form.myfreetext.$error.maxlength">Too long!</span> <span class="error text-small block" ng-if="Form.myfreetext.$error.minlength">Too short!</span> </div> </div> 循环的最后一次迭代中遇到未定义的行为

$scope.shouldDisable = function(key) {
   if(!$scope.myModel.mychosenjobs[key]) {
      var count = 0;
      Object.keys($scope.myModel.mychosenjobs).forEach(function(key) {
         if($scope.myModel.mychosenjobs[key]) {
            ++count;
         }
      });

      if(count >= 3) {
         return true;
      }
   }

   return false;
};

因为它实际上在做

printf

while ((myStr[index]!='*')&&(index<(sizeof(myStr)/sizeof(myStr[0])))) { ... 访问 while ((myStr[3] .... 越界。

要解决此问题,请执行以下操作:

myStr[3]

Boolean short-circuiting将处理myStr未执行。

答案 1 :(得分:0)

你正在操纵字符串,女巫需要以空终止。 您应该使用fgets(3)来获取字符串,然后使用strlen(3)来获取长度。 然后你可以移动你的字符串 while(str [i]!='*'&amp;&amp; i&lt; strlen(str)) 祝你好运