C语言中的Ascii字符串转换器

时间:2015-08-06 11:53:06

标签: c string ascii

我是初学者,在做这类问题时。 下面是一个问题以及我试图根据给定问题开发的代码。我看到每当我添加输入字符串时,它都不会继续进行。 问题是:

超级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");
}

2 个答案:

答案 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;。

继续下一个字符串。