资深守护
1088 合法文件名
经验值:0 时间限制:1000毫秒
题目描述 Description
给定一个文件名字符串,判断是否为合法文件名。
合法文件名有如下规定:
1、只由数字、字母(大小写皆可)、下划线(_)组成。
2、不以数字开头,如以字母开头,必为大写字母。
输入描述 Input Description
输入为一行,包含一个长度不超过20的字符串,且字符串中不包含空格,
输出描述 Output Description
输出为一行,若它是合法文件名,则输出"Yes",否则输出"No"。
样例输入 Sample Input
Abcd1234_abcd
样例输出 Sample Output
Yes
WA30代码:
文字版:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<string>
#include<iomanip>
#include<sstream>
using namespace std;
int main(){
string s;
int x=0;
cin>>s;
for(int i=0;i<=s.size()-1;i++){
if(s[i]>='0'&&s[i]<='9'||s[i]>='a'&&s[i]<='z'||s[i]>='A'&&s[i]<='Z'||s[i]=='_'){
x=1;
}
if(i==0){
if(s[i]>='0'&&s[i]<='9'||s[i]>='a'&&s[i]<='z'){
x=0;
}
else{
x=1;
}
}
}
if(x==1){
cout<<"Yes";
}
else{
cout<<"No";
}
return 0;
}
正规版:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<string>
#include<iomanip>
#include<sstream>
using namespace std;
int main(){
string s;
int x=0;
cin>>s;
for(int i=0;i<=s.size()-1;i++){
if(s[i]>='0'&&s[i]<='9'||s[i]>='a'&&s[i]<='z'||s[i]>='A'&&s[i]<='Z'||s[i]=='_'){
x=1;
}
if(i==0){
if(s[i]>='0'&&s[i]<='9'||s[i]>='a'&&s[i]<='z'){
x=0;
}
else{
x=1;
}
}
}
if(x==1){
cout<<"Yes";
}
else{
cout<<"No";
}
return 0;
}
图片版:
实在找不到那里错了
王月在2021-07-22 21:13:34追加了内容
ding
王月在2021-07-23 10:14:56追加了内容
改后代码1:样例没过,WA40
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<string>
#include<iomanip>
#include<sstream>
using namespace std;
int main(){
string s;
int x=0;
getline(cin,s);
for(int i=0;i<=s.size()-1;i++){
if(s[i]>='0'&&s[i]<='9'||s[i]>='a'&&s[i]<='z'||s[i]>='A'&&s[i]<='Z'||s[i]=='_'){
}
else{
cout<<"No";
return 0;
}
if(i==0){
if(s[i]>='0'&&s[i]<='9'||s[i]>='a'&&s[i]<='z'){
}
else{
cout<<"No";
return 0;
}
}
}
cout<<"Yes";
return 0;
}
改后代码2:样例过了,AC
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<string>
#include<iomanip>
#include<sstream>
using namespace std;
int main(){
string s;
int x=0;
getline(cin,s);
for(int i=0;i<=s.size()-1;i++){
if(s[i]>='0'&&s[i]<='9'||s[i]>='a'&&s[i]<='z'||s[i]>='A'&&s[i]<='Z'||s[i]=='_'){
x=1;
}
else{
x=0;
break;
}
if(i==0){
if(s[i]>='0'&&s[i]<='9'||s[i]>='a'&&s[i]<='z'){
x=0;
break;
}
else{
x=1;
}
}
}
if(x==1){
cout<<"Yes";
}
else{
cout<<"No";
}
return 0;
}
还是非常感谢
@王文博
从他的回答中我找到了灵感
缔造者之神
代码有一点问题:
x的初始值应该是1,因为只要有一个不符合,就不是合法的。
如果s为0a0a0a0a,我们先进入第一个循环,发现符合第1个if,x=1,再进入下一个判断,我们发现0符合第2个if中的if的要求,x=0;
但是我们发现,a符合第1个if的要求,x又变回了1!
也就是说,0a0a0a0a,这个是不合法的,但是输出的是合法的!
最重要的一点是合法文件名必须符合全部要求,不是只符合1个要求就是合法的。
所以,应该这样修改:
1.在第1个if的下面加上else,里面写cout<<"No";return 0;
2.在第2个if里面的第一个if的里面加上cout<<"No"return 0;
3.x不要了,所有和x相关的语句都要删去,到最后直接输出"Yes"即可。
祝你AC!
望采纳!