【发布时间】:2014-12-03 17:38:46
【问题描述】:
我似乎很难让我的字符串以 \0 结尾。我不确定这是不是问题,所以我决定发一个帖子。
首先,我将我的字符串声明为:
char *input2[5];
稍后在程序中,我添加了这行代码,将所有剩余未使用的插槽转换为\0,将它们全部更改为空终止符。本来可以用 for 循环完成的,但是是的。
while (c != 4) {
input2[c] = '\0';
c++;
}
在 Eclipse 中,当处于调试模式时,我看到空槽现在包含 0x0,而不是 \0。这些是一样的吗?我将其声明为的另一个字符串
char input[15] = "";
在调试模式下显示 \000。
我的问题是我遇到了分段错误(在 Debian VM 上。不过在我的 Linux 12.04 上工作)。我的猜测是,因为字符串并没有真正终止,编译器不知道它何时停止,因此当它明显已经超出范围时继续尝试访问数组中的内存。
编辑:我会尽快回答所有其他问题,但是当我将字符串声明更改为另一个建议的声明时,我的程序崩溃了。有一个 strtok() 函数,用于将我的 fgets 输入切割成字符串,然后将它们放入我的 input2 数组中。
所以,
input1[0] = 'l'
input1[1] = 's'
input1[2] = '\n'
input2[0] = "ls".
这是一个带有fork和execvp的shell模拟程序。我会尽快发布更多代码。
关于建议:
字符 *input2[5];这是一个完全合法的声明,但它 将 input2 定义为指针数组。要包含一个字符串,它需要 是一个字符数组。
我将再次尝试该更改。我之前确实尝试过,但我记得它给了我另一个运行时错误(段错误?)。我认为这是因为我实现 strtok() 函数的方式。我会再检查一次。谢谢!
编辑 2:我在下面添加了回复以更新我目前的进度。感谢大家的帮助!
.
【问题讨论】:
-
你需要使用
char input2[5];,而不是char *input2[5];。 -
问:你为什么不声明你的字符串
char input[5];?你真的需要额外的间接级别吗?问:while (c < 4)更安全。并且一定要初始化“c”! -
是的,调试器中的“0x0”和源代码中的“\0”是“同一件事”。
-
@FoggyDay:我怀疑情况并非如此。调试器可能正在使用
0x0来显示空指针 的值;它可能会使用'\0'来显示空字符 的值。不幸的是,正如我在回答中提到的,'\0'是一个有效的空指针常量。 -
嗨,格雷格!感谢您指出了这一点。我在下面添加了回复。我展示了我的 strtok 代码。这就是为什么我决定声明为 char input2[5] 因为 strtok 只接受 char 而不是我认为的 char 数组。