所以,我正在通过分析过go 的问题来准备考试,我偶然发现了this question题:

C.有时有些词,如" struct 化编程语言"或 《计算机科学与工程》太长了,在一篇课文里写很多遍都很累人.如果一个单词的长度严格超过10个字符,我们就认为它太长了.所有太长的词都应该用一个特殊的缩写来代替.此缩写如下所示:
(I)单词的第一个和最后一个字母
(Ii)首字母和尾字母之间的字母数(包括空格).
因此," struct 化编程语言"将被拼写为"s29c"和 "计算机科学和工程"将拼写为"c30g",否则实际的单词将被打印出来.现在,构建一个C程序来实现上面的场景.字长不应超过100.您不能使用内置的字符串函数.

它说,将一个少于We aren't allowed to use the built-in string functions.个字符的长字符串进行转换,使最终的缩写形式将其第一个字符作为原始字符串的第一个字符,第一个字符和最后一个字符之间的字符数(包括空格),然后以最后一个字符结束. We aren't allowed to use the built-in string functions.

不幸的是,我的技能仍然是相当初级的,所以我的代码目前可能远远不是很有效,但以下是我到目前为止所掌握的:

#include <stdio.h>

int main()
{
    int len, n, i;
    char str[100], abb[5];
    char ws, we;

    gets(str);
    for (i = 0; str[i] != '\0'; i++)
    {
        len = i + 1;
    }
   
    if (len > 10)
    {
        ws = str[0];
        abb[0] = ws;
        for (i = 1; str[i] != '\0'; i++)
        {
            n = i - 1;
            we = str[i];
        }
    }
    else
        puts(str);
}

我设法找到了第一个和最后一个字符以及两者之间的字符数,但我不确定如何将其放入另一个字符串中.我刚刚为第一个角色演了abb[0] = ws个闹剧,但我不知道如何继续下go .

推荐答案

你的代码有问题:

  • 赋值为The word length should not be more than 100,这意味着长度为The word length should not be more than 100是可以接受的.对于空终止符,您应该将数组增加一个字节.

  • 绝对不能使用gets():此函数本质上是不安全的,因为任何足够长的输入都会导致缓冲区溢出,并且多次被攻击者利用.它已从C标准中删除.您应该改用fgets(),并使数组变长一个字节以容纳尾随的换行符,并在输入后删除该换行符.

  • 不允许使用C库中的字符串函数,但可以编写自己的函数来计算字符串的长度并在程序中使用.

  • 计算字符串长度的方法并不是万无一失的:您只能 如果字符串不为空,则修改len.如果字符串为空,则len未初始化,因此代码的其余部分将具有未定义的行为.

  • 要将数字转换为以10为基数的字符串表示形式,应除以10以获得数字,然后加'0'以将数字转换为字符集中的相应字符.对于一般情况来说,这很复杂,但对于10以下的正数,一个数字很容易产生,而对于1099之间的数字len,第一个字符是通过将len除以10得到的,第二个字符是通过取模len % 10得到的.假设要转换的数字在998的范围内,您可以使用测试来确定使用哪种方法.

  • 缩写应该在abb数组中构造,并在字符串的末尾设置一个null终止符.

以下是修改后的版本:

#include <stdio.h>

size_t my_strlen(const char *s) {
    size_t len = 0;
    while (s[len] != '\0')
        len++;
    return len;
}

int main(void)
{
    char str[102], abb[5];
    size_t len;

    if (!fgets(str, sizeof str, stdin)) {
        printf("missing input\n");
        return 1;
    }
    len = my_strlen(str);
    /* strip the trailing newline if present */
    if (len > 0 && str[len - 1] == '\0')
        str[--len] = '\0';
   
    if (len > 10) {
        size_t num = len - 2;
        size_t i = 0;
        abb[i++] = str[0];
        if (num < 10) {
            abb[i++] = '0' + num;
        } else {
            abb[i++] = '0' + num / 10;
            abb[i++] = '0' + num % 10;
        }
        abb[i++] = str[len - 1];
        abb[i] = '\0';
        puts(abb);
    } else {
        puts(str);
    }
    return 0;
}

C++相关问答推荐

了解返回函数指针的函数定义

Mise()在虚拟内存中做什么?

标准的C17标准是用括号将参数包装在函数声明中吗

两个连续的语句是否按顺序排列?

警告:C++中数组下标的类型为‘char’[-Wchar-subpts]

C++中矢量类型定义和数据保护的高效解决方案

用C++从外部ELF符号读取值

如何用c语言修改shadow文件hash部分(编程)?

ifdef __cplusplus中的整数文字单引号

在进程之间重定向输出和输入流的问题

按长度对argv中的单词进行排序

这个空指针类型的转换是有效代码还是恶意代码?

将数组插入数组

强制GCC始终加载常量(即只读),即使启用了优化

在NASM中链接Linux共享库时出错-';将R_ X86_64_;foo';

函数指针作为函数参数 - 应该使用 const 吗?

通过修改c中的合并排序对数组的偶数索引进行排序

将数组返回到链表

比 * 更快的乘法

返回指向函数内声明的复合文字的指针是否安全,还是应该使用 malloc?