鱼C论坛

 找回密码
 立即注册
查看: 556|回复: 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()`:

  1. #include <stdio.h>
  2. #include <ctype.h>

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

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

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

  14.     // 统计字母和数字个数
  15.     for (int i = 0; i < 3; i++) {
  16.         for (int j = 0; lines[i][j] != '\0'; j++) {
  17.             if (isalpha(lines[i][j])) {
  18.                 letterCount++;
  19.             } else if (isdigit(lines[i][j])) {
  20.                 digitCount++;
  21.             }
  22.         }
  23.     }

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

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

  32.     return 0;
  33. }
复制代码


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

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

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

以下是完整的程序代码:

  1. #include <stdio.h>

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

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

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

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

  16.     return 0;
  17. }
复制代码


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

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

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://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;
}


小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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


我们可以在代码中加入统计英文字母和数字的功能。以下是完整的解决方案:

  1. #include <stdio.h>
  2. #include <ctype.h>  // 引入ctype.h以使用isalpha()和isdigit()函数

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

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

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

  13.         // 统计每行中的字母和数字
  14.         for (int j = 0; lines[i][j] != '\0'; j++) {
  15.             if (isalpha(lines[i][j])) {
  16.                 letterCount++;
  17.             } else if (isdigit(lines[i][j])) {
  18.                 digitCount++;
  19.             }
  20.         }
  21.     }

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

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

  30.     return 0;
  31. }
复制代码


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

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

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

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

为什么  gets(lines[i]);中的gets说是未定义标识符
小甲鱼最新课程 -> https://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()`:

  1. #include <stdio.h>
  2. #include <ctype.h>

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

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

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

  14.     // 统计字母和数字个数
  15.     for (int i = 0; i < 3; i++) {
  16.         for (int j = 0; lines[i][j] != '\0'; j++) {
  17.             if (isalpha(lines[i][j])) {
  18.                 letterCount++;
  19.             } else if (isdigit(lines[i][j])) {
  20.                 digitCount++;
  21.             }
  22.         }
  23.     }

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

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

  32.     return 0;
  33. }
复制代码


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

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

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-10 00:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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