问题标题: 酷町堂:1088 合法文件名

0
0
已解决
王月
王月
资深守护
资深守护

1088   合法文件名

经验值:0 时间限制:1000毫秒

题目描述 Description

给定一个文件名字符串,判断是否为合法文件名。
合法文件名有如下规定:
1、只由数字、字母(大小写皆可)、下划线(_)组成。
2、不以数字开头,如以字母开头,必为大写字母。

输入描述 Input Description

输入为一行,包含一个长度不超过20的字符串,且字符串中不包含空格,

输出描述 Output Description

输出为一行,若它是合法文件名,则输出"Yes",否则输出"No"。

样例输入 Sample Input

Abcd1234_abcd

样例输出 Sample Output

Yes

1088传送门

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

还是非常感谢

@王文博 

从他的回答中我找到了灵感

 


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!

望采纳!

我要回答