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;
}
如果您调用不带参数的程序,它不会打印任何内容,因为循环不会调用 printf
或 uppercase
,因为 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, ...)
作为错误消息,因为错误消息不应与正常输出混合。
所以,我正在使用指针编写大写函数。我正在尝试在有输入时发出错误消息,但不幸的是,在终端中我没有看到任何类似 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;
}
如果您调用不带参数的程序,它不会打印任何内容,因为循环不会调用 printf
或 uppercase
,因为 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, ...)
作为错误消息,因为错误消息不应与正常输出混合。