这里为什么要用break跳出if语句
Why is break used here to break out of if statement
这里为什么用break
来跳出if语句?允许吗?
为什么最后x和y变成了0? x = 0; y = 0
#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;
}
break
不会退出 if 语句,它会退出最内层的循环。它肯定是允许的,break 仅在 if
或 switch
语句中有用。
每次最外层的 'q' 循环运行时,x 和 y 都需要重置为零。一种更清晰的组织代码的方法是将每个局部变量放在尽可能小的范围内,并适当地命名变量以提高可读性。即x
=>n_upper_vowels
,y
=>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
分配近 1 兆字节(我相信 windows 进程的最大值为 1MB)过于危险。 编辑(感谢@Bob__) 题目说最大输入10万字符,所以应该是char si[100001]
:100K,不是1M。您也可以(应该!)使用 scanf
的宽度说明符来防止缓冲区溢出,如上所示。
这里为什么用break
来跳出if语句?允许吗?
为什么最后x和y变成了0? x = 0; y = 0
#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;
}
break
不会退出 if 语句,它会退出最内层的循环。它肯定是允许的,break 仅在 if
或 switch
语句中有用。
x 和 y 都需要重置为零。一种更清晰的组织代码的方法是将每个局部变量放在尽可能小的范围内,并适当地命名变量以提高可读性。即x
=>n_upper_vowels
,y
=>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
分配近 1 兆字节(我相信 windows 进程的最大值为 1MB)过于危险。 编辑(感谢@Bob__) 题目说最大输入10万字符,所以应该是char si[100001]
:100K,不是1M。您也可以(应该!)使用 scanf
的宽度说明符来防止缓冲区溢出,如上所示。