鱼C论坛

 找回密码
 立即注册
查看: 1551|回复: 3

[已解决]求大神找误

[复制链接]
发表于 2023-3-30 16:34:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
科研工作者经常要向不同的期刊投稿。但不同期刊的参考文献的格式往往各不相同。有些期刊要求参考文献所发表的期刊名必须采用缩写形式,否则直接拒稿。现对于给定的期刊名,要求按以下规则缩写:
(1)长度不超过4的单词不必缩写;
(2)长度超过4的单词仅取前4个字母,但其后要加“.”;
(3)所有字母都小写。

输入格式:

输入一个包含大小写字母和空格的字符串(长度不超过85),单词由若干字母构成,单词之间以一个空格间隔。

输出格式:
对于每组测试,在一行上输出缩写后的结果,单词之间以一个空格间隔。

输入样例:
Ad Hoc Networks

输出样例:
ad hoc netw.
我写的代码
#include<stdio.h>
#include<string.h>
int main()
{
    char a[80],b[80];int j=0;
    gets(a);
    int n=strlen(a);
    int count=0;
    for(int i=0;i<n;i++)
    {
        if(count==4) {b[j]='.';j++;}
        else if( (a[i]<='Z')&&(a[i]>='A')&&(count<=4) )
        {b[j]=a[i]+20;count++;j++;}
        else if(a[i]==' ')
        {
            count=0;
        }
            
    }
    for(int i=0;i<j;i++)
    {
        printf("%c",b[j]);
    }
    return 0;
}
啥都没输出来。。。。
最佳答案
2023-3-30 17:35:35
你好,你的代码有一些错误,我来帮你指出并修改:


gets 函数不安全,应该使用 fgets 函数。

在第 17 行,应该是 printf("%c",b[i]); 而不是 printf("%c",b[j]);。

在第 14 行,应该是 b[j]=a[i]+32; 而不是 b[j]=a[i]+20;,因为大小写字母间的 ASCII 码差值为 32。

在第 7 行,将 char b[80] 改为 char b[85],因为题目中给出的字符串长度不超过 85。
修改后的代码如下:
#include <stdio.h>
#include <string.h>
int main() {
    char a[85], b[85];
    fgets(a, 85, stdin);
    int n = strlen(a);
    int count = 0, j = 0;
    for (int i = 0; i < n; i++) {
        if (count == 4) {
            b[j] = '.';
            j++;
        } else if ((a[i] >= 'a' && a[i] <= 'z') || (a[i] >= 'A' && a[i] <= 'Z')) {
            if (count < 4) {
                b[j] = (a[i] >= 'A' && a[i] <= 'Z') ? a[i] + 32 : a[i];
                count++;
                j++;
            }
        } else if (a[i] == ' ') {
            count = 0;
        }
    }
    for (int i = 0; i < j; i++) {
        printf("%c", b[i]);
    }
    return 0;
}
有用请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-30 17:22:22 | 显示全部楼层
char a[80],b[80];int j=0;
    gets(a);
    int n=strlen(a);
    int count=0;
    for(int i=0;i<n;i++)
    {
        if(count==4) {b[j]='.';j++;count++;}//////////////////////////////
        else if(count<4)
        {
            if( (a[i]<='Z')&&(a[i]>='A'))
                b[j]=a[i]+'a'-'A';//////////////////////////////////
            else
                b[j]=a[i];///////////////////////////////////
            count++;
            j++;
        }
        if(a[i]==' ')/////////////////////////
        {
            count=0;
        }


    }
    for(int i=0;i<j;i++)
    {
        printf("%c",b[i]);////////////////////////////
    }
    return 0;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-30 17:35:35 | 显示全部楼层    本楼为最佳答案   
你好,你的代码有一些错误,我来帮你指出并修改:


gets 函数不安全,应该使用 fgets 函数。

在第 17 行,应该是 printf("%c",b[i]); 而不是 printf("%c",b[j]);。

在第 14 行,应该是 b[j]=a[i]+32; 而不是 b[j]=a[i]+20;,因为大小写字母间的 ASCII 码差值为 32。

在第 7 行,将 char b[80] 改为 char b[85],因为题目中给出的字符串长度不超过 85。
修改后的代码如下:
#include <stdio.h>
#include <string.h>
int main() {
    char a[85], b[85];
    fgets(a, 85, stdin);
    int n = strlen(a);
    int count = 0, j = 0;
    for (int i = 0; i < n; i++) {
        if (count == 4) {
            b[j] = '.';
            j++;
        } else if ((a[i] >= 'a' && a[i] <= 'z') || (a[i] >= 'A' && a[i] <= 'Z')) {
            if (count < 4) {
                b[j] = (a[i] >= 'A' && a[i] <= 'Z') ? a[i] + 32 : a[i];
                count++;
                j++;
            }
        } else if (a[i] == ' ') {
            count = 0;
        }
    }
    for (int i = 0; i < j; i++) {
        printf("%c", b[i]);
    }
    return 0;
}
有用请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-30 19:38:28 | 显示全部楼层
你的代码中有两个问题:

在输出最终结果时,你使用了错误的下标 j,应该使用变量 i。

当输入字符串的最后一个单词长度小于或等于 4 时,你没有在该单词后添加空格和缩写的点号。

因此,你可以修改你的代码如下:
#include <stdio.h>
#include <string.h>

int main()
{
    char a[80], b[80];
    int j = 0;
    gets(a);
    int n = strlen(a);
    int count = 0;
    for (int i = 0; i < n; i++)
    {
        if (count == 4)
        {
            b[j] = '.';
            j++;
            count = 0;
        }
        if ((a[i] >= 'A') && (a[i] <= 'Z'))
        {
            b[j] = a[i] + 32;
            j++;
            count++;
        }
        else if ((a[i] >= 'a') && (a[i] <= 'z'))
        {
            b[j] = a[i];
            j++;
            count++;
        }
        else if (a[i] == ' ')
        {
            b[j] = ' ';
            j++;
            count = 0;
        }
    }
    b[j] = '.'; // 添加最后一个单词的点号
    b[j + 1] = '\0'; // 添加字符串结束符
    printf("%s\n", b);

    return 0;
}
这个代码解决了上述问题并能正确输出结果。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-7 17:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表