为啥函数不执行特定行
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 的值中看到它没有“关闭”字符串。 @无用 如果您在调试器中单步执行每一行,您可以查看控制是否转移到该行。可以?这与是否具有预期效果不同。当您观察到s
和 strlen
做错事时返回的值究竟是什么?
哦,我现在明白你的意思了。它没有跳过该行,而是以错误的逻辑执行它。在 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;
【讨论】:
以上是关于为啥函数不执行特定行的主要内容,如果未能解决你的问题,请参考以下文章