为啥函数不执行特定行

Posted

技术标签:

【中文标题】为啥函数不执行特定行【英文标题】:Why does the function not execute a specific line为什么函数不执行特定行 【发布时间】:2022-01-17 01:07:04 【问题描述】:

我正在尝试构建一个函数,它接受一个正整数并用字符串表示它 使用递归。字符串未初始化。

void intToStr(int num, char s[])

    if (num / 10 == 0) 
        s[0] = num + '0';
        s[1] = '\0';
    
    else 
        intToStr(num / 10, s);
        s[strlen(s)] = num % 10 + '0';
        s[strlen(s) + 1] = '\0';
    

但我不明白为什么当我运行代码时它会跳过这一行

s[strlen(s) + 1] = '\0';

【问题讨论】:

你到底在做什么来决定它跳过那一行?您是在调试器中单步执行代码,还是查看结果,还是什么? 我正在调试器中的每一行,我可以在 s 的值中看到它没有“关闭”字符串。 @无用 如果您在调试器中单步执行每一行,您可以查看控制是否转移到该行。可以?这与是否具有预期效果不同。当您观察到 sstrlen 做错事时返回的值究竟是什么? 哦,我现在明白你的意思了。它没有跳过该行,而是以错误的逻辑执行它。在 s[strlen(s)] =` num % 10 + '0' 行之后; ` strlen size 连接到内存中的下一个 '\0' 和插入 '\0' 之后的行,因此它不会改变长度。感谢您的帮助! 这样反复调用strlen(s)是个坏主意 【参考方案1】:

在:

        s[strlen(s)] = num % 10 + '0';
        s[strlen(s) + 1] = '\0';

strlen 在执行第一行时不会保持不变。第一行在终止字符串的 null 上放置了一个新字符。然后第二行中的strlen(s) 重新计算字符串长度。由于空字符消失了,strlen 继续寻找空字符。它返回的长度取决于缓冲区中是否已经存在另一个空字符。如果您没有对其进行初始化,strlen 可能会返回更长的长度,或者程序可能会崩溃或出现其他异常。

你可以解决这个问题:

        size_t length = strlen(s);
        s[length] = num % 10 + '0';
        s[length + 1] = '\0';

intToStr 返回长度也可能很方便,这样就不必每次都重新计算:

size_t intToStr(int num, char s[])

    if (num / 10 == 0)
    
        s[0] = num + '0';
        s[1] = '\0';
        return 1;
    
    else
    
        size_t length = intToStr(num / 10, s);
        s[length] = num % 10 + '0';
        s[length+1] = '\0';
        return length+1;
    

【讨论】:

以上是关于为啥函数不执行特定行的主要内容,如果未能解决你的问题,请参考以下文章

如何使不满足特定条件的行不出现在结果中

暂停执行直到收到套接字上的特定消息?

仅当行不存在时,如何在 SQL Server 中执行插入操作? [复制]

为啥“解释”返回的行不等于count()?

为啥“解释”返回的行不等于count()?

JS函数中for循环结束后为啥不执行下条语句,怎么让其执行?