我是初学者,在做这类问题时。 下面是一个问题以及我试图根据给定问题开发的代码。我看到每当我添加输入字符串时,它都不会继续进行。 问题是:
超级ASCII字符串检查器: 在Byteland国家/地区,当且仅当字符串中每个字符的计数等于其ascii值时,字符串“S”才被称为超级ascii字符串。 在Byteland国家,ascii代码'a'是1,'b'是2 ...'z'是26。 您的任务是找出给定的字符串是否是超级ascii字符串。 输入格式: 第一行包含多个测试用例T,后跟T行,每行包含一个字符串“S”。 输出格式: 对于每个测试用例,如果字符串“S”是超级ascii,则打印“是”,否则打印“否” 约束: 1·; = T< = 100 1< = | S |< = 400,S将仅包含小写字母('a' - 'z')。
这就是我所做的:
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
void main()
{
char s[40];
int i,j,count=1;
bool p;
printf("\nEnter the string:");
scanf("%s",s);
int n = strlen(s);
for(i=0; i<n;i++){
for(j=0;j<n;j++){
if(s[i]==s[j+1])
count++;
}
int asc = toascii(s[i])-96;
if(asc == count){
p = true;
count=0;
}
else
p=false;
}
if(p)
printf("Yes, the given string is super string");
else
printf("No, it ain't a super string");
}
答案 0 :(得分:2)
将代码拆分为一个函数会更简单,该函数将测试字符串是超级字符串,因为只要一个字母的计数不等于值,就会知道您可以立即返回false。根据你的逻辑,这意味着你应该:
else {
p=false;
break;
}
用count=1
替换愚蠢的count=0
初始化!
这是一个固定版本(无法测试,我的编译器没有stdbool.h)
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
bool isSuperString(const char *s)
{
int i,j;
int n = strlen(s);
for(i=0; i<n;i++){
int count=0;
for(j=0;j<n;j++){
if(s[i]==s[j])
count++;
}
int asc = s[i]-96;
if(asc != count){
return false;
}
}
return true;
}
int main()
{
char s[401];
printf("\nEnter the string:");
scanf("%400s",s);
if(isSuperString(s))
printf("Yes, the given string is super string");
else
printf("No, it ain't a super string");
return 0;
}
但问到你的主要是:
int main()
{
int n, i, cr;
char s[401]; // max 400 characters in input
cr = scanf("%d", &n); // always control input
if (cr != 1) {
fprintf(stderr, "Error at first line\n");
return 1;
}
for (i=0; i<n; i++) {
cr = scanf("%400s",s); // always limit input strings
if (cr != 1) {
fprintf(stderr, "Error at test line %d\n", i+1);
return 1;
}
if(isSuperString(s))
printf("Yes %s\n", s);
else
printf("NO %s\n", s);
}
return 0;
}
答案 1 :(得分:1)
由于您的代码不在所需逻辑附近,我会给您一些指示。
您需要计算每种类型的字母数。这意味着您需要26个计数器,每种类型的字母一个。我建议使用数组,例如int counters[26];
对于每个字符串&#34; S&#34;测试你需要先将所有计数器设置为0。
然后循环遍历字符串,并为每个字母增加该字母的计数器。
最后,遍历计数器并检查它们是否等于它们的值。请注意,0也是可以接受的(字母根本不会出现在字符串中)。 如果任何字母未通过测试,请打印&#34;否\ n&#34;否则打印&#34;是\ n&#34;。
继续下一个字符串。