2301_80160352 2023-11-08 21:36 采纳率: 62.5%
浏览 3

c语言基础具体情景问题求解!


#include<stdio.h>
#include<string.h>
int main()
{
    long t,i,k;
    scanf("%ld\n",&t);
    char a[t][100000];
    for(i=0;i<t;i++)
    {
        scanf("%s",a[i]);
    }
    int len(char a[]);
    for(i=0;i<t;i++)
    {
        k=len(a[i]);
        printf("%ld\n",k);
    }
    return 0;
}
int len(char a[])
{
    int k,i,l;
    l=strlen(a);
    if(l==1)
        k=1;
    else
        for(i=0;i<l-1;i++)
        {
            if(a[i]=='\0')
            break;
            if(a[i]!=a[i+1])
                k=k+1;
        }
    return (k);
}

这个代码是想要通过输入n行字符串,把每个字符串变为相邻两个字母都不同的新字符串,输出变换后字符串的长度,请问一下为什么我的代码运行出来结果很离谱😫

  • 写回答

2条回答 默认 最新

  • 老牛毕设 2023-11-08 21:58
    关注

    你的代码逻辑有一些问题。在函数 len(char a[]) 中,你在循环中检查了字符串 a 的所有字符,然后根据这些字符是否相等来增加 k 的值。然而,你在循环中并没有对字符进行任何修改,所以无论输入的字符串是什么,k 的值都将增加 l-1,其中 l 是输入字符串的长度。

    此外,你在主函数中定义了一个二维字符数组 a,但并没有指定数组的第二维的大小。当你试图输入字符串并存储在 a 中时,可能会发生缓冲区溢出。为了避免这种情况,你应该指定第二维的大小,比如 char a[t][100],其中 t 是你要输入的字符串的数量。

    你可能想要实现的逻辑是将每个字符串中的重复字符删除,只保留每个字符首次出现的情况。这个逻辑需要修改你的 len(char a[]) 函数。

    这是您的代码的修改版本。这个修改后的代码将会遍历输入的每个字符串,检查每对相邻的字母,并在需要时增加计数器k的值。当遇到一个字符串的最后一个字符时,它将不再继续向后遍历,以避免产生错误。

    #include<stdio.h>
    #include<string.h>
    
    int main()
    {
        long t, i, k;
        scanf("%ld\n", &t);
        char a[t][100000];
        for(i = 0; i < t; i++)
        {
            scanf("%s", a[i]);
        }
        for(i = 0; i < t; i++)
        {
            k = len(a[i]);
            printf("%ld\n", k);
        }
        return 0;
    }
    
    int len(char a[])
    {
        int k, i;
        int l = strlen(a);
        if(l == 1)
        {
            k = 1;
            return k;
        }
        else
        {
            for(i = 0; i < l - 1; i++) // 修改了这里,从0遍历到l-2,避免遍历到'\0'字符
            {
                if(a[i] == '\0') // 这里改为a[i],避免产生错误
                    break; // 修改了这里,跳出循环的条件是遇到'\0'字符,而不是遍历到字符串的最后一个字符'\0'
                if(a[i] != a[i + 1]) // 这里改为a[i+1],避免产生错误,并且需要在遍历到字符串的最后一个字符'\0'之前停止循环,避免产生错误
                    k = k + 1; // 这里改为k = k + 1,增加计数器k的值,记录不同字母的数量
            }
            return (k); // 返回计数器k的值,记录不同字母的数量
        }
    }
    
    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 11月8日