gpt4 book ai didi

c - K&R escape.. 中的练习 3-2.. 程序可以运行,但有一个小问题

转载 作者:行者123 更新时间:2023-11-30 17:29:07 25 4
gpt4 key购买 nike

练习 3-2。编写一个函数 escape(s,t),在将字符串 t 复制到 s 时,将换行符和制表符等字符转换为\n 和\t 等可见转义序列。使用开关。也为另一个方向编写一个函数,将转义序列转换为真实字符。

大家好,我的程序运行得很好,但是你们知道为什么当我取出 s[s_index] = 0 时程序仍然可以运行吗?是否应该存在内存错误导致它在实际字符串之后打印出垃圾?

#include <stdio.h>

void escape(char s[], char t[]);

int main() {
char s[50];
char t[50] = "hello\nguys\tbye \t \n h k eew l ";
escape(s, t);
printf("%s\n", t);
printf("%s\n", s);
}

void escape(char s[], char t[]) {
int s_index = 0;
int t_index = 0;
while (t[t_index] != '\0') {
switch (t[t_index]) {
case ('\n'):
s[s_index] = '\\';
s[s_index + 1] = 'n';
t_index++;
s_index = s_index + 2;
break;
case ('\t'):
s[s_index] = '\\';
s[s_index + 1] = 't';
t_index++;
s_index = s_index + 2;
break;
default:
s[s_index] = t[t_index];
s_index++;
t_index++;
break;
}
}
//s[s_index] = '\0';
}

最佳答案

当您使用定义数组时

char s[50];

由编译器决定如何初始化s。该标准没有规定它们应该如何初始化。最安全的选择是假设它们被初始化为垃圾。在这个假设下,最好有这样一行:

s[s_index] = '\0';

看起来您的编译器正在使用 0 初始化 s,并且您看到了合理的行为。

您可以使用 0 初始化 s

char s[50] = {0};

即使你这样做了,最好还是有这条线

s[s_index] = '\0';

转义中。更安全的做法是在 escape 中假设 s 已使用垃圾值进行初始化。

关于c - K&R escape.. 中的练习 3-2.. 程序可以运行,但有一个小问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25777458/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com