You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

技术问询:如何检测回车键按下并存储字符数组,及判断词的类型

一、如何检测回车键是否被按下,并将字符存入字符数组?

其实有两种常用的方法,都能安全实现需求:

方法1:用fgets()(推荐,更安全)

fgets()会自动读取包括回车键(\n)在内的输入,还能限制读取长度,避免缓冲区溢出。示例代码:

#include <stdio.h>
#include <string.h>

int main() {
    char arr[100];
    // 读取输入,最多存99个字符(留1位给字符串结束符'\0')
    fgets(arr, sizeof(arr), stdin);
    
    // 检查是否读取到回车键
    int len = strlen(arr);
    if (len > 0 && arr[len-1] == '\n') {
        printf("回车键已被按下~\n");
        // 如果不需要保留换行符,可以把它替换成'\0'
        arr[len-1] = '\0';
    }
    
    printf("存入的字符数组内容:%s\n", arr);
    return 0;
}

方法2:用getchar()逐个读取

如果你需要更精细的控制,可以用getchar()逐个读字符,直到遇到'\n':

#include <stdio.h>

int main() {
    char arr[100];
    int i = 0;
    char ch;
    
    // 读取直到回车键或数组满
    while ((ch = getchar()) != '\n' && i < 99) {
        arr[i++] = ch;
    }
    arr[i] = '\0'; // 手动添加字符串结束符
    
    printf("存入的字符数组内容:%s\n", arr);
    return 0;
}

二、判断句子中的词属于数字、浮点数还是字符类型的代码优化

你的思路方向是对的,但代码有几个小问题需要调整,比如gets()不安全、逻辑判断不够严谨、字符串截断错误等。我帮你优化了代码,同时保留你的核心逻辑:

#include <stdio.h>
#include <ctype.h>
#include <string.h>

int main() {
    char s[200];
    // 用fgets替代gets,避免缓冲区溢出
    if (fgets(s, sizeof(s), stdin) == NULL) {
        printf("读取输入失败啦\n");
        return 1;
    }
    
    // 去掉末尾的换行符(如果存在)
    size_t len = strlen(s);
    if (len > 0 && s[len-1] == '\n') {
        s[len-1] = '\0';
    }
    
    char b[200];
    int word_start = 0; // 记录当前单词的起始索引
    int idx = 0;
    
    while (s[idx] != '\0') {
        b[idx] = s[idx];
        
        // 遇到空格或者到字符串末尾时,处理当前单词
        if (s[idx] == ' ' || s[idx+1] == '\0') {
            // 确定单词的结束索引
            int word_end = (s[idx+1] == '\0') ? idx : idx - 1;
            // 截断出当前单词
            b[word_end + 1] = '\0';
            
            int dot_count = 0;    // 统计小数点数量
            int digit_count = 0;  // 统计数字数量
            int alpha_count = 0;  // 统计字母数量
            
            // 遍历当前单词的每个字符
            for (int i = word_start; i <= word_end; i++) {
                if (b[i] == '.') {
                    dot_count++;
                } else if (isdigit(b[i])) {
                    digit_count++;
                } else if (isalpha(b[i])) {
                    alpha_count++;
                }
            }
            
            // 输出当前单词和判断结果
            printf("%s===", &b[word_start]);
            if (dot_count == 1 && digit_count > 0 && alpha_count == 0) {
                printf(" It's a float number\n");
            } else if (dot_count == 0 && digit_count > 0 && alpha_count == 0) {
                printf(" It's an integer number\n");
            } else if (alpha_count > 0 && digit_count == 0 && dot_count == 0) {
                printf(" It's a character word\n");
            } else {
                printf(" It's a mixed type\n");
            }
            
            // 更新下一个单词的起始位置
            word_start = idx + 1;
        }
        
        idx++;
    }
    
    return 0;
}

优化点说明:

  • 替换gets()为fgets():gets()没有长度限制,很容易导致缓冲区溢出,fgets()更安全。
  • 修正单词截取逻辑:之前的索引更新有问题,现在用word_start和word_end准确标记每个单词的范围。
  • 完善类型判断:
    • 浮点数:恰好1个小数点,至少1个数字,没有字母
    • 整数:无小数点,至少1个数字,没有字母
    • 纯字符单词:至少1个字母,无数字和小数点
    • 混合类型:比如带字母的数字、多个小数点的情况等
  • 处理了字符串末尾的单词:之前的代码可能会漏掉最后一个单词,现在通过判断s[idx+1] == '\0'来覆盖这种情况

内容的提问来源于stack exchange,提问作者Priom Sarkar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:37:59