首页 > 解决方案 > 为什么这里用break来跳出if语句

问题描述

为什么break这里用 if 语句来突破呢?是否允许?

为什么 x 和 y 最后变成 0?x = 0; y = 0

https://www.hackerearth.com/practice/basic-programming/input-output/basics-of-input-output/practice-problems/algorithm/vowels-love/submissions/* *

#include<stdio.h>
#include<string.h>
 
int main(){
  int i,x=0,j,y=0,T,p,q;
  char s1[1000001], v1[6] ="aeiou", v2[6] = "AEIOU";
  scanf("%d",&T);
  for(q=0;q<T;q++){
    scanf("%s",&s1);
    p=strlen(s1);
    for(i=0;i<5;i++){
       for(j=0;j<p;j++){
        if(v1[i]== s1[j]){
          y++;
          break;
        }
      }
    }
           
    for(i=0;i<5;i++){
      for(j=0;j<p;j++){
        if(v2[i]== s1[j]){
          x++;
          break;
        }
      }
    }
 
    if(y==5 || x==5) 
      printf("lovely string\n");
    else
      printf("ugly string\n");
    
    x=0;
    y=0;
  }
  return 0;
}

标签: cloopsfor-loopif-statementbreak

解决方案


break不退出 if 语句,它退出最里面的循环。肯定是允许的,break 只在iforswitch语句中有用。

每次最外面的“q”循环运行时,x 和 y 都需要重置为零。组织代码的一种更清晰的方法是将每个局部变量放在其可能的最小范围内,并适当地命名变量以提高可读性。即x=> n_upper_vowelsy=>n_lower_vowels等。

int main(){
  int T;
  char word[100001], lower_vowels[6] ="aeiou", upper_vowels[6] = "AEIOU";
  scanf("%d",&T);
  for(int q=0;q<T;q++){
    int n_upper_vowels=0,n_lower_vowels=0;
    scanf("%100000s",&word);
    int word_len=strlen(word);

    for(int i=0;i<5;i++){
       for(int j=0;j<word_len;j++){
        if(lower_vowels[i] == word[j]){
          n_lower_vowels++;
          break;
        }
      }
    }
           
    for(int i=0;i<5;i++){
      for(int j=0;j<word_len;j++){
        if(upper_vowels[i] == word[j]){
          n_upper_vowels++;
          break;
        }
      }
    }
 
    if(n_lower_vowels==5 || n_upper_vowels==5) 
      printf("lovely string\n");
    else
      printf("ugly string\n");
  }
  return 0;
}

在堆栈上分配几乎一兆字节s1(我相信 Windows 进程的最大值是 1MB)过度接近危险。编辑(感谢@Bob__)问题说最大输入是100,000个字符,所以应该是char si[100001]:100K,而不是1M。您可以(应该!)使用宽度说明符scanf来防止缓冲区溢出,如上所示。


推荐阅读