EG -
maabcma是有效的,因为它包含ma作为正确的前缀以及正确的后缀。 panaba不是。
如何在C语言中查明某个单词是否有效?
我不太擅长字符串操作。所以,请用伪代码帮我解决。
提前致谢。
我完全迷失了。 T =测试用例数。
编辑:新代码。我到目前为止最好的代码 -
#include<stdio.h>
#include<string.h>
void main()
{
int i,T,flag=0;
int j,k,len=0;
char W[10],X[10];
scanf("%d",&T);
for(i=0;i<T;i++)
{
scanf("%s",W);
for(len=0;W[len]!='\0';len++)
X[len]=W[len];
X[len]='\0';
for(j=len-1;j>=0;j--)
for(k=0;k<len;k++)
{
if(X[k]!=W[j])
flag=0;
else if((j-k)==(len-1))
flag==1;
}
if (flag == 1)
printf("NICE\n");
else
printf("NOT\n");
}
}
仍然没有得到正确的结果。我哪里错了?
答案 0 :(得分:0)
问题是,如果匹配存在,您只设置标志的值,否则您必须将其设置为0.因为如果我有,请参阅:
pammbap
我的前缀是pam
,后缀是bap
。
根据最终的循环,
p
和a
匹配,因此标记设置为1
。
但是当谈到b
和m
时,它不会变为零。因此,它返回true。
答案 1 :(得分:0)
首先,void
不是main
的有效返回类型,除非您正在为Plan 9进行开发。
其次,你应养成检查scanf()
和所有输入函数的返回值的习惯。如果用户未输入数字,则不能依赖T
的值,因为T
未初始化。同样,您不应将scanf
与无界 %s
扫描操作一起使用。如果用户输入20个字符,则不适合您拥有的十个字符缓冲区。另一种方法是使用fgets
一次获取整行文本,或者使用有界扫描操作。如果您的数组适合10个字符(包括空终止符),那么您可以使用scanf("%9s", W)
。
第三,单字符变量名通常很难理解。使用W
而不是word
而不是T
,而不是使用testCount
或类似内容。这意味着第一次查看代码的人可以更轻松地找出每个变量的用途。
最重要的是,想想你脑海中的过程,并将其记录在纸上。你会如何自己解决这个问题?例如,从 n = 1开始,
还有一些其他的事情需要考虑,你想要最大的匹配吗?例如,在输入字符串ababcdabab
中,前缀ab
也是后缀,但关于abab
可以说相同。在这种情况下,您不希望停止处理,即使找到前缀也希望继续处理,因此,您应该只存储最大前缀的 length ,也就是后缀。
第二重要的是,在学习C时遇到这样的障碍是非常普遍的,所以不要让这会让你的热情变得迟钝,只是继续努力!