【问题标题】:is it possible to use one string function inside another string function in c是否可以在 c 中的另一个字符串函数中使用一个字符串函数
【发布时间】:2021-08-08 08:17:33
【问题描述】:

是否可以在另一个字符串函数中使用一个字符串函数。见下文.... strcmp(string1, strupr(string2)); 这里我使用了 strupr() 函数将 string2 的所有字符变为大写,然后通过 strcmp() 函数与 string1 进行比较。 下面是我的程序...

#include <stdio.h>
#include <string.h>
int main()
{
    char str[41], name[43];
    gets(str);
    gets(name);
    if (strcmp(strupr(str), name) == 0)
        printf("\nwow it works.");
    return 0;
}

以下是编译器显示的错误..

use of undeclared identifier 'strupr'; did you mean 'strdup'?

【问题讨论】:

  • is it possible to use one string function 有可能。但是不能使用不存在的函数,例如strupr
  • strupr 是你自己写的吗?请出示。无论如何,这实际上与字符串函数本身无关。这只是基本的C。如果内部函数返回的值与外部函数所需的参数类型兼容,那么它将起作用。
  • 即使是这样的简单示例,也永远不要使用像gets 这样的dangerous 函数。请改用fgets
  • @ShambhavGautam 这是一个糟糕的建议。为什么不使用 toupper 函数,如果它存在并使用所用的编码? ASCII 不是唯一的编码。
  • @Suraj 阅读最后的注释:这是一个非标准函数,仅适用于旧版本的 Microsoft C。

标签: arrays c string function


【解决方案1】:

将 cmets 浓缩为答案:

只要内部函数的返回类型匹配(或兼容)外部函数的参数类型,这将起作用。

一个简单的例子,它将打印数字3

int add1(int a) {
    return a + 1;
}

int main(void) {
    printf("%d\n", add1(add1(add1(0))));
}

只要您的strupr 函数返回char *(或const char * 等),它将作为strcmp 的函数原型工作:

int strcmp(const char *s1, const char *s2);

要创建一个将整个字符串大写的基本函数,您只需逐个字符循环遍历字符串并在每个字符上使用toupper 函数。有几种方法可以实现这个循环。

这是一种这样的方式:

char *upcase(char *s) {
    for (char *p = s; p && *p; p++)
        *p = toupper(*p);
    return s;
}

请注意,这是一个破坏性函数,它会更改传递给它的字符串的内容。它不适用于静态字符串(例如,const char *foo = "abcdefg";)。

【讨论】:

    【解决方案2】:

    由于您的目标似乎是以不区分大小写的方式比较两个字符串,您应该使用stricmp

    if (stricmp(str, name) == 0)
            printf("\nwow it works.");
    

    它具有额外的好处,即既不更改原始字符串,也不分配新字符串给free()

    【讨论】:

    • 没有解决 OP 的问题
    • 但是这里我必须用大写的字符串。
    猜你喜欢
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    • 2015-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多