Acm真题csdn

可惜这个问题你离AC只有一步之遥。实际上,当你输入n时,会有一个回车,getline会读取那个回车。当然,回车不能是合法的标识符,所以不管测试数据是什么,你的输出都会在开头加上一个no。事实上,它只需要在CIN & gt;& gtn;在它后面加一个getchar()就行了。

示例:

# include & ltiostream & gt

# include & lt字符串& gt

# include & ltctype.h & gt

使用命名空间std

int main()

{

int n;

CIN & gt;& gtn;

getchar();

while(n -)

{

int flag = 1;

字符串s;

getline(南CIN);

如果(!isalpha(s[0])& amp;& amps[0]!='_ ')标志= 0;////检查开头是字母还是下划线。

for(int I = 1;我& lts.length()。i++)

{

如果(!伊索那姆(s[I])& amp;& amps[i]!= ' _ '){ flag = 0;打破;}

}

if(flag)cout & lt;& lt“是”& lt& ltendl

else cout & lt& lt“否”& lt& ltendl

}

返回0;

}

估计你可能用的是VC。如果打算搞ACM,就不要用VC了。VC和ACM官方认可的GCC和G++编译器差别很大。很多VC保证的东西在G++里是不保证的,建议用DEV C++或者Codeboxes。还有,我想说,字符串类型要慎用。一般这种题都是测试字符串的模拟运算,不需要用到字符串。我的AC的代码供参考(GCC):

# include & ltstdio.h & gt

# include & ltstring.h & gt

char a[100];

int i,n,m,temp

int main(void)

{

scanf("%d ",& ampn);

getchar();

while(n -)

{

temp = 1;

获取(a);

m = strlen(a);

如果(!(a[0]>= 65 & amp& ampa[0]& lt;=90||a[0]>= 97 & amp& ampa[0]& lt;= 122 | | a[0]= = ' _ '))printf(" no \ n ");

其他

{

for(I = 1;我& ltm;i++)

{

如果(!(a[I]& gt;= 65 & amp& ampa[I]& lt;= 90 | | a[I]& gt;= 97 & amp& ampa[I]& lt;= 122 | | a[I]= = ' _ ' | | a[I]& gt;= 48 & amp& ampa[I]& lt;=57))

{

temp = 0;

打破;

}

}

if(temp = = 1)printf(" yes \ n ");

else printf(" no \ n ");

}

}

返回0;

}