鱼C论坛

 找回密码
 立即注册
查看: 157|回复: 5

[已解决]C语言作业

[复制链接]
发表于 2024-11-6 09:41:45 | 显示全部楼层 |阅读模式

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

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

x
1)掌握键盘输入字符串方法。
(2)掌握二维数组的处理方法。
【技术要点】
(1)3行文字可定义一个二维字符数组来表示。
(2)使用gets()函数对字符串进行输入。
程序代码:
#include<stdio.h>
int main()
{
  /*完成统计*/
  return0;
}
最佳答案
2024-11-6 19:41:36
wc8576 发表于 2024-11-06 19:41
为什么  gets(lines);中的gets说是未定义标识符


`gets()` 函数在C11标准中被移除了,因此在较新的C编译器中使用可能会遇到未定义标识符的错误。它的移除是由于安全性问题,因为 `gets()` 不能限制输入长度,容易导致缓冲区溢出,带来安全隐患。

对于安全性和现代编程实践,建议使用 `fgets()` 代替 `gets()`。`fgets()` 可以指定最大读取长度,能够防止缓冲区溢出。下面是一个改进后的代码,使用 `fgets()`:
#include <stdio.h>
#include <ctype.h>

int main() {
    // 定义一个二维字符数组,每行最多80个字符
    char lines[3][81];  // 每行80个字符,最后一个字符为字符串结束符'\0'
    int letterCount = 0;
    int digitCount = 0;

    // 提示用户输入3行文本
    printf("请输入三行文字(每行最多80字符):\n");

    // 使用 fgets() 函数读取每一行输入
    for (int i = 0; i < 3; i++) {
        fgets(lines[i], 81, stdin);  // 81以包括字符串结束符
    }

    // 统计字母和数字个数
    for (int i = 0; i < 3; i++) {
        for (int j = 0; lines[i][j] != '\0'; j++) {
            if (isalpha(lines[i][j])) {
                letterCount++;
            } else if (isdigit(lines[i][j])) {
                digitCount++;
            }
        }
    }

    // 输出用户输入的文字
    printf("\n您输入的三行文字是:\n");
    for (int i = 0; i < 3; i++) {
        printf("%s", lines[i]);
    }

    // 输出统计结果
    printf("\n其中英文字母的个数是:%d\n", letterCount);
    printf("其中数字的个数是:%d\n", digitCount);

    return 0;
}

### 代码说明:
1. **`fgets()` 的使用:** `fgets(lines[i], 81, stdin);` 表示从标准输入读取一个最多80个字符的字符串(包括字符串结束符),并将其存储在 `lines[i]` 中。

2. **二维字符数组:** 定义 `char lines[3][81];`,即每行最多80个字符,总共3行。

3. **注意:** `fgets()` 会将输入中的换行符 `\n` 保留在字符串中。可以根据需要在处理时去除换行符,例如使用 `strcspn()` 函数来查找并替换换行符。

这种方式更安全并且兼容现代C标准。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-11-6 10:23:31 | 显示全部楼层
好的,让我们来填补这个程序代码,以便实现使用 `gets()` 函数输入 3 行字符串,并将其存储在二维字符数组中。需要注意的是,`gets()` 函数在现代C标准中被认为不安全,因为它不检查输入长度,因此建议使用 `fgets()` 代替。不过,为了符合您的要求,下面仍然使用 `gets()`。

以下是完整的程序代码:
#include <stdio.h>

int main() {
    // 定义一个二维字符数组,假设每行最多允许输入99个字符
    char lines[3][100];

    // 提示用户输入3行文本
    printf("请输入三行文字:\n");

    // 使用 gets() 函数读取每一行输入
    for (int i = 0; i < 3; i++) {
        gets(lines[i]);
    }

    // 输出用户输入的三行文字
    printf("\n您输入的三行文字是:\n");
    for (int i = 0; i < 3; i++) {
        printf("%s\n", lines[i]);
    }

    return 0;
}

### 代码说明:
1. **二维数组定义:** `char lines[3][100];` 定义了一个二维字符数组,可以存储 3 行字符串,每行长度最多为 99 个字符(预留1个字符用于存储字符串结束符 `\0`)。

2. **使用 `gets()` 函数:** 该程序使用 `gets(lines[i]);` 来读取键盘输入,存储到数组的每一行。

3. **输出内容:** 程序读取完输入后,逐行输出用户输入的内容。

尽管 `gets()` 简单易用,要注意它不安全,因为它无法控制输入长度。现代的编程实践中建议使用 `fgets()` 替代,并且需要处理字符串末尾可能留下的换行符。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-11-6 19:35:28 | 显示全部楼层
本帖最后由 wc8576 于 2024-11-6 19:37 编辑

有一篇文章,共有3行文字,每行80个字符。要求分别统计出其中英文字母和数字的个数。
【项目目的】
(1)掌握键盘输入字符串方法。
(2)掌握二维数组的处理方法。
【技术要点】
(1)3行文字可定义一个二维字符数组来表示。
(2)使用gets()函数对字符串进行输入。
程序代码:
#include<stdio.h>
int main()
{
/*完成统计*/
return0;
}


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-11-6 19:35:38 | 显示全部楼层
wc8576 发表于 2024-11-06 19:35
还要求分别统计出其中英文字母和数字的个数。


我们可以在代码中加入统计英文字母和数字的功能。以下是完整的解决方案:
#include <stdio.h>
#include <ctype.h>  // 引入ctype.h以使用isalpha()和isdigit()函数

int main() {
    // 定义一个二维字符数组,假设每行最多允许输入99个字符
    char lines[3][100];
    int letterCount = 0;
    int digitCount = 0;

    // 提示用户输入3行文本
    printf("请输入三行文字:\n");

    // 使用 gets() 函数读取每一行输入
    for (int i = 0; i < 3; i++) {
        gets(lines[i]);

        // 统计每行中的字母和数字
        for (int j = 0; lines[i][j] != '\0'; j++) {
            if (isalpha(lines[i][j])) {
                letterCount++;
            } else if (isdigit(lines[i][j])) {
                digitCount++;
            }
        }
    }

    // 输出用户输入的三行文字
    printf("\n您输入的三行文字是:\n");
    for (int i = 0; i < 3; i++) {
        printf("%s\n", lines[i]);
    }

    // 输出统计结果
    printf("\n其中英文字母的个数是:%d\n", letterCount);
    printf("其中数字的个数是:%d\n", digitCount);

    return 0;
}

### 代码说明:
1. **`ctype.h`:** 通过引入此头文件,我们可以使用 `isalpha()` 和 `isdigit()` 函数来检查字符是否为字母和数字。

2. **统计变量:** `letterCount` 和 `digitCount` 用于分别计数英文字母和数字。

3. **循环统计:** 在读取每一行输入后,通过遍历字符数组判断并计数字母和数字,用 `isalpha()` 函数检查是否是字母,用 `isdigit()` 函数检查是否是数字。

4. **输出统计结果:** 最后输出统计得到的字母和数字数量。

这些更改使得程序不仅可以存储和显示输入的字符串,还可以计算其中包含的字母和数字的数量。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-11-6 19:41:19 | 显示全部楼层
FishC 发表于 2024-11-6 19:35
我们可以在代码中加入统计英文字母和数字的功能。以下是完整的解决方案:

为什么  gets(lines[i]);中的gets说是未定义标识符
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-11-6 19:41:36 | 显示全部楼层    本楼为最佳答案   
wc8576 发表于 2024-11-06 19:41
为什么  gets(lines);中的gets说是未定义标识符


`gets()` 函数在C11标准中被移除了,因此在较新的C编译器中使用可能会遇到未定义标识符的错误。它的移除是由于安全性问题,因为 `gets()` 不能限制输入长度,容易导致缓冲区溢出,带来安全隐患。

对于安全性和现代编程实践,建议使用 `fgets()` 代替 `gets()`。`fgets()` 可以指定最大读取长度,能够防止缓冲区溢出。下面是一个改进后的代码,使用 `fgets()`:
#include <stdio.h>
#include <ctype.h>

int main() {
    // 定义一个二维字符数组,每行最多80个字符
    char lines[3][81];  // 每行80个字符,最后一个字符为字符串结束符'\0'
    int letterCount = 0;
    int digitCount = 0;

    // 提示用户输入3行文本
    printf("请输入三行文字(每行最多80字符):\n");

    // 使用 fgets() 函数读取每一行输入
    for (int i = 0; i < 3; i++) {
        fgets(lines[i], 81, stdin);  // 81以包括字符串结束符
    }

    // 统计字母和数字个数
    for (int i = 0; i < 3; i++) {
        for (int j = 0; lines[i][j] != '\0'; j++) {
            if (isalpha(lines[i][j])) {
                letterCount++;
            } else if (isdigit(lines[i][j])) {
                digitCount++;
            }
        }
    }

    // 输出用户输入的文字
    printf("\n您输入的三行文字是:\n");
    for (int i = 0; i < 3; i++) {
        printf("%s", lines[i]);
    }

    // 输出统计结果
    printf("\n其中英文字母的个数是:%d\n", letterCount);
    printf("其中数字的个数是:%d\n", digitCount);

    return 0;
}

### 代码说明:
1. **`fgets()` 的使用:** `fgets(lines[i], 81, stdin);` 表示从标准输入读取一个最多80个字符的字符串(包括字符串结束符),并将其存储在 `lines[i]` 中。

2. **二维字符数组:** 定义 `char lines[3][81];`,即每行最多80个字符,总共3行。

3. **注意:** `fgets()` 会将输入中的换行符 `\n` 保留在字符串中。可以根据需要在处理时去除换行符,例如使用 `strcspn()` 函数来查找并替换换行符。

这种方式更安全并且兼容现代C标准。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-21 21:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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