W2126 2025-12-04 22:43 采纳率: 100%
浏览 15
已结题

关于C语言strcspn函数的一个问题

img

这是学校给的一串代码,但是由于gets不能在VS2022上运行,所以我改了一下:


#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#include <string.h>
int main() {
    // 修正str[0]的顺序:按10输出'0',按2次输出空格(符合题目“0和空格”的规则)
    char ch[501], str[10][6] = {
        "0 ",    // 0对应的字符:按1次→'0',按2次→' '
        "1,.?!", // 1对应的字符
        "2ABC",  // 2对应的字符
        "3DEF",  // 3对应的字符
        "4GHI",  // 4对应的字符
        "5JKL",  // 5对应的字符
        "6MNO",  // 6对应的字符
        "7PQRS", // 7对应的字符
        "8TUV",  // 8对应的字符
        "9WXYZ"  // 9对应的字符
    };
    int i, j, k, len, flag = 0, count = 0;


    fgets(ch, sizeof(ch), stdin);
    ch[strcspn(ch, "\n")]= '\0 ';


    len = strlen(ch);
    for (i = 0; i < len; i++) {
        if (ch[i] != ' ') {  // 遇到数字,统计当前数字的按下次数
            count++;
            flag = 1; // 标记处于“当前数字的按键段”
        }
        else if (flag) 
        {   // 遇到空格,处理当前按键段
            j = ch[i - 1] - '0'; // 将字符数字转为整数(如'2'2//int str_len = strlen(str[j]); // 获取当前数字对应的字符组长度
            // 计算对应字符的索引:按n次→取第n-1位(循环取余)
            k = (count - 1) % strlen(str[j]);


            printf("%c", str[j][k]); // 输出对应字符
            count = 0; // 重置按下次数
            flag = 0;  // 重置按键段标记
        }
    }

    return 0;
}

新的代码在gets与最后一个字符上优化了一下
但是我认为这一串代码本来运行不了的
因为

   ch[strcspn(ch, "\n")]= '\0 ';

单引号不应该填字符串吗?我填了\0与空格却能运行,为什么啊?我改成了双引号反而会报错,我怎么学习这方面的内容啊?

  • 写回答

6条回答 默认 最新

  • fengbizhe 2025-12-05 09:00
    关注

    vs正常的警告等级没那么严,估计是被忽略了,你调高些应该就会报警告,用gcc跑是会报警告的

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

问题事件

  • 系统已结题 12月19日
  • 已采纳回答 12月11日
  • 创建了问题 12月4日