C: 如何使 "pointer return function" 的参数 NULL 安全?

C: How to make "pointer return function"'s argument NULL safe?

所以,我正在使用指针编写大写函数。我正在尝试在有输入时发出错误消息,但不幸的是,在终端中我没有看到任何类似 s==NULL 的东西不能正常工作我看不到任何错误消息。

可能是关于参数类型和指针的问题,但我没有真正看到它!

如果我的程序参数是这样的:

"Hello 123dsd" "teSting"

输出为:

HELLO 123DSD

TESTING

如果我的程序参数为空:


输出什么都没有:


如果参数为空,我想显示错误消息,例如:

Please insert a string!

这是我的代码:

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

#define MAGIC_NUMBER 32

char *uppercase(char *s)
{
    if (s == NULL)
    {
        printf("Please insert a string!");
        return 0; //Not working!!
    }
    else
    {
        for(char *p = s; *p!=0; ++p)
        {
            if ('a' <= *p && *p <= 'z')
                *p = *p - MAGIC_NUMBER;
        }

        return s;
    }
}


int main(int argc, char *argv[])
{
    for(int i=1; i < argc; i++)
    {
        printf("%s \n", uppercase(argv[i]));
    }


    return 0;
}

如果您不向程序输入任何参数,argc 将为 1,因此永远不会进入 main 函数中的 for 循环。这也意味着 NULL 指针永远不会传递给 uppercase.

您需要将缺少参数的检查移至 main:

int main(int argc, char *argv[])
{
    if (argc == 1) {
        printf("Please insert a string!");
        return 1;
    }
    for(int i=1; i < argc; i++)
    {
        printf("%s \n", uppercase(argv[i]));
    }

    return 0;
}

如果您调用不带参数的程序,它不会打印任何内容,因为循环不会调用 printfuppercase,因为 argc 的值为 1.

您必须向 main 添加代码才能处理这种情况。

int main(int argc, char *argv[])
{

    if(argc < 2)
    {
        fprintf(stderr, "Please insert a string!\n")
        return 1;
    }

    for(int i=1; i < argc; i++)
    {
        printf("%s \n", uppercase(argv[i]));
    }


    return 0;
}

请注意,我使用 fprintf(stderr, ...) 作为错误消息,因为错误消息不应与正常输出混合。