Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

最近总是出现这种问题,大家有遇到过吗?【代码显示头文件的'<' 时,显示错乱,显示为&lt; 】 #280

Open
Qin-shun-Li opened this issue Apr 12, 2024 · 5 comments

Comments

@Qin-shun-Li
Copy link

WeChat67aa3107caa70af47790e930ac0d76dc
每次显示C语言头文件的时候就会出现这种问题,有很大概率出现,用的是gpt-4-turbo一系列的模型1106,0125,0409

可以给大家几个提示词试一试
提示词一:
使用C语言完成下面编程问题
给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配。

'.' 匹配任意单个字符
'*' 匹配零个或多个前面的那一个元素
所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。

示例 1:

输入:s = "aa", p = "a"
输出:false
解释:"a" 无法匹配 "aa" 整个字符串。
示例 2:

输入:s = "aa", p = "a*"
输出:true
解释:因为 '*' 代表可以匹配零个或多个前面的那一个元素, 在这里前面的元素就是 'a'。因此,字符串 "aa" 可被视为 'a' 重复了一次。
示例 3:

输入:s = "ab", p = "."
输出:true
解释:"." 表示可匹配零个或多个('*')任意字符('.')。

bool isMatch(char* s, char* p) {

}

提示词二:
使用C语言完成下面编程问题
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。

字符 数值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:

I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
给你一个整数,将其转为罗马数字。

示例 1:

输入: num = 3
输出: "III"
示例 2:

输入: num = 4
输出: "IV"
示例 3:

输入: num = 9
输出: "IX"
示例 4:

输入: num = 58
输出: "LVIII"
解释: L = 50, V = 5, III = 3.
示例 5:

输入: num = 1994
输出: "MCMXCIV"
解释: M = 1000, CM = 900, XC = 90, IV = 4.

@Dooy
Copy link
Owner

Dooy commented Apr 12, 2024

通过复制出来看看 gpt 吐了什么东西出来

image

@Qin-shun-Li
Copy link
Author

为了将一个给定的整数转换为罗马数字,我们可以使用一个贪心算法,从最大的罗马数字值开始匹配,直到整数减少到零。下面是一个使用C语言实现的转换函数,这个函数考虑了所有罗马数字的可能组合,包括那些特殊的减法规则。

#include &lt;stdio.h>

void intToRoman(int num, char *result) {
    // 罗马数字值和相应的符号
    int values[] = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
    char *symbols[] = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
    
    // 初始化结果字符串
    *result = '\0';
    
    // 从
失败原因

{
"line": 348,
"column": 3797,
"sourceURL": "http://127.0.0.1:13667/assets/index.vue_vue_type_script_setup_true_lang-2a434168.js"
}

__________________________________
以上就是复制之后的内容,因为格式错乱,我手动给他截止了

@Qin-shun-Li
Copy link
Author

还有一个是示例1的输出,如下:
以下是使用C语言实现正则表达式匹配的代码。这个函数主要通过递归方式处理各种字符匹配情况,包括普通字符、'.' 和 '*'。

#include &lt;stdbool.h>

bool isMatch(char* s, char* p) {
    // 如果模式串 p 为空,那么文本串 s 也必须为空才能匹配成功
    if (*p == '\0') return *s == '\0';

    // 检查当前字符是否匹配(s 不为空且字符相同,或 p 的当前字符是 '.')
    bool first_match = (*s != '\0') && (*p == '.' || *p == *s);

    // 看 p 的下一个字符是否是 '*',如果是则进行递归判断
    if (*(p + 1) == '*') {
        // '*' 表示前一个字符可以出现 0 次或多次
        // 分两种情况讨论:不使用 '*' 匹配或使用 '*' 至少匹配一次(递归 s 的下一个字符)
        return isMatch(s, p + 2) || (first_match && isMatch(s + 1, p));
    } else {
        // 如果下一个字符不是 '*',则简单递归匹配下一个字符
        return first_match && isMatch(s + 1, p + 1);
    }
}

int main() {
    char* s1 = "aa";
    char* p1 = "a";
    printf("Example 1: %s<br />", isMatch(s1, p1) ? "true" : "false"); // 输出:false

    char* s2 = "aa";
    char* p2 = "a*";
    printf("Example 2: %s<br />", isMatch(s2, p2) ? "true" : "false"); // 输出:true

    char* s3 = "ab";
    char* p3 = ".";
    printf("Example 3: %s<br />", isMatch(s3, p3) ? "true" : "false"); // 输出:false (修正错误示例)

    return 0;
}

在这段代码中,isMatch 函数通过递归处理两大类型的字符:普通字符和带有特殊含义的字符('.' 和 '')。对于 '',我们处理它表示的“零个或多个前面的字符”匹配方式,即通过递归调用在不使用 '' 或使用 '' 的情况下继续匹配余下的字符串。注意,演示代码中的输入输出和示例说明应保持一致。

@Qin-shun-Li
Copy link
Author

image image

复制出来的实际效果是这样的

@Qin-shun-Li
Copy link
Author

配上一条最新的格式问题的回答:
图片:
image
提示词:
给我讲讲C语言的qsort函数,给我配上一个简单的例子
从回答那复制出来的样式:
image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants