取决于 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 的返回值的不同值[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

MAUI在窗口(页面)关闭后获取其返回值

MAUI在窗口(页面)关闭后获取其返回值

MAUI在窗口(页面)关闭后获取其返回值

staruml里方法的返回值类型怎么设

返回错误值的函数[关闭]

C#中如何为一个有返回值的函数添加新线程