取决于 Main 的返回值的不同值[关闭]
Posted
技术标签:
【中文标题】取决于 Main 的返回值的不同值[关闭]【英文标题】:Differents value in depending of the return of Main [closed] 【发布时间】:2021-07-12 22:23:31 【问题描述】:谁能解释我为什么在 main 中返回 0,这返回给我写“A”,而没有“I”?
#include <unistd.h>
int ft_str_is_uppercase(char *str)
while(*str)
if(!(*str >= 65 && *str <= 90))
write(1,"A",1);
return(0);
str++;
write(1,"I",1);
return(1);
int main(void)
char tertius[0];
ft_str_is_uppercase(&tertius);
return(0);
【问题讨论】:
这个char tertius[0];
是什么意思?
什么是空字符?什么是非空字符?
这段代码中有很多未定义的行为。为什么tertius
声明为0
长度?即使它更大,将未初始化的缓冲区传递给然后尝试使用内容的函数仍然没有意义。为什么您希望在这些条件下行为以任何方式合理/可预测?
“char 为空”是什么意思?也许你误解了任务的要求。但是,除非您真正向我们提供确切的任务描述,否则我们无能为力。
事实上 @user3386109 ,它的工作原理,谢谢大家。
【参考方案1】:
对于初学者(C 标准,6.7.6.2 数组声明符)
5 如果大小是一个不是整数常量的表达式 表达式:如果它出现在函数原型范围的声明中, 它被视为被 * 替换; 否则,每次 被评估它应该有一个大于零的值...
就是这个声明
char tertius[0];
不正确。所以程序已经有未定义的行为。即使您将数组的大小指定为大于 0,但数组并未初始化。
进一步,函数调用中参数的类型
ft_str_is_uppercase(&tertius);
不正确。它是char ( * )[0]
,而函数需要char *
类型的参数。
int ft_str_is_uppercase(char *str)
^^^^^^^^^
在这个 if 语句中使用幻数 65 和 90
if(!(*str >= 65 && *str <= 90))
使您的代码不清楚。
【讨论】:
【参考方案2】:char tertius[0];
ft_str_is_uppercase(&tertius);
此调用调用未定义的行为。它将指针传递给没有元素的数组。行为未定义,任何事情都可能发生(包括段错误或奇怪的输出)。
这里有一个函数示例,如果字符串为空、为 NULL 或包含不是大写字母的内容,则返回 1
。我还演示了允许goto
的极少数情况之一。
int ft_str_is_uppercase(char *str)
int retval = 1;
if(str && *str)
while(*str)
if(!isupper(*str++)) goto return_from_function;
retval = 0;
return_from_function:
return retval;
int main(void)
char tertius[] = "";
char nontertius[] = "ABC";
char nontertius1[] = "ABCs";
printf("\nReturned value = %d\n", ft_str_is_uppercase(tertius));
printf("\nReturned value = %d\n", ft_str_is_uppercase(nontertius));
printf("\nReturned value = %d\n", ft_str_is_uppercase(nontertius1));
【讨论】:
以上是关于取决于 Main 的返回值的不同值[关闭]的主要内容,如果未能解决你的问题,请参考以下文章