有没有办法用C中的strcmp比较两个不同长度的字符串

有没有办法用C中的strcmp比较两个不同长度的字符串,c,C,假设我想将24和4作为一个字符串进行比较。由于24基于ASCII值大于4,因此它不会返回正数,而是尝试返回负值,因为它仅比较两个字符串的前几位,因为它们具有不同的字符串长度。有没有办法比较两个字符串中的所有字符 #include <stdio.h> #include <string.h> int main() { char st[100] = "24"; char st1[100]= "4"; printf("%d", strcmp(st, s

假设我想将24和4作为一个字符串进行比较。由于24基于ASCII值大于4,因此它不会返回正数,而是尝试返回负值,因为它仅比较两个字符串的前几位,因为它们具有不同的字符串长度。有没有办法比较两个字符串中的所有字符

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

int main() {
    char st[100] = "24";
    char st1[100]= "4";

    printf("%d", strcmp(st, st1));
}
C标准定义了strcmp:

int strcmpcont char*s1,const char*s2

strcmp函数应将s1指向的字符串与s2指向的字符串进行比较。 非零返回值的符号应由第一对字节的值之间的差值符号确定,这两个字节都被解释为类型无符号字符,它们在被比较的字符串中不同

返回值

完成后,如果s1指向的字符串分别大于、等于或小于s2指向的字符串,则strcmp应返回大于、等于或小于0的整数


规范仅说明返回值的符号,而不是值本身,因此,不,使用strcmp无法实现您想要的功能。

@AndrewHenle评论:

如果要比较不同位数的数字而不是字符串,则需要将字符串转换为实际数字

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

int main()
{
    char st[100] = "24";
    char st1[100]= "4";

    long val, val1;
    char * endptr;

    errno = 0;
    val = strtol( st, &endptr, 10 );
    if ( errno == ERANGE || *endptr != '\0' )
    {
        // error parsing st -- not a number, or additional characters
        return EXIT_FAILURE;
    }

    val1 = strtol( st1, &endptr, 10 );
    if ( errno == ERANGE || *endptr != '\0' )
    {
        // error parsing st1 -- not a number, or additional characters
        return EXIT_FAILURE;
    }

    printf("%ld", val - val1);
    return EXIT_SUCCESS;
}
从您的注释中可以清楚地看出,您希望比较字符串中包含的数值,您只需要这样做—将字符串转换为实际数字

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

int main()
{
    char st[100] = "24";
    char st1[100]= "4";

    long val, val1;
    char * endptr;

    errno = 0;
    val = strtol( st, &endptr, 10 );
    if ( errno == ERANGE || *endptr != '\0' )
    {
        // error parsing st -- not a number, or additional characters
        return EXIT_FAILURE;
    }

    val1 = strtol( st1, &endptr, 10 );
    if ( errno == ERANGE || *endptr != '\0' )
    {
        // error parsing st1 -- not a number, or additional characters
        return EXIT_FAILURE;
    }

    printf("%ld", val - val1);
    return EXIT_SUCCESS;
}

您可以直接使用,特别是如果您可以保证字段包含数字,并且只包含正确值范围内的数字,因为您已经从您显然正在处理的日期输入中解析了这些数字,但我更愿意展示更健壮的错误检查版本。

给定字符串4和24,您会将24字符串中的4与什么进行比较?如果要比较不同位数的数字而不是字符串,则需要将字符串转换为实际数字。该函数用于确定两个字符串是否相同。在24和4的情况下,它不看24的其余部分,因为没有必要。只要看第一个字符,它就知道字符串是不同的。我需要使用字符串,因为如果我必须使用一个字符,比如我想将2019-4和2019-24与连字符进行比较,它会不会忽略第一个字符串中最后一个数字的值?我不明白。请指定要用于比较字符串的算法。比较两个字符串中的所有字符意味着什么?你可以一次比较两件事——一个角色和另一个角色。如何比较所有字符?结果应该是什么?我想比较2019-4和2019-24,然后将字符串转换成一对数字,然后比较数字,这不是你想要的吗?谢谢你解释清楚。