我正在尝试执行printf
函数printf ("%*s%s", indent, "", *w)
我知道它是如何工作的,但我无法得到正确的结果,这是“真实的”。
这是我在gdb
中显示变量的内容。
在第31行之后,我执行:
(gdb) n
我希望打印“真实”。 相反,我没有看到任何东西。 为什么会这样?
31 printf ("%*s%s", indent, "", *w);
6: **w = 116 't'
5: *w = 0x7ffffffd7eb0 "true"
4: w = (char **) 0x7ffffffd76b0
3: **(c->u.word) = 116 't'
2: *(c->u.word) = 0x7ffffffd7eb0 "true"
1: c->u.word = (char **) 0x7ffffffd76b0
(gdb) n
32 while (*++w) // if next character is not null, keep printing.
6: **w = 116 't'
5: *w = 0x7ffffffd7eb0 "true"
4: w = (char **) 0x7ffffffd76b0
3: **(c->u.word) = 116 't'
2: *(c->u.word) = 0x7ffffffd7eb0 "true"
1: c->u.word = (char **) 0x7ffffffd76b0
执行(gdb) n
后,我预计*w
的值会被打印出来。但是我一无所获。
为什么?
代码
case SIMPLE_COMMAND:
{
char **w = c->u.word;
printf ("%*s%s", indent, "", *w);
printf ("%*s%s", indent, "", "true");
while (*++w) // if next character is not null, keep printing.
printf (" %s", *w);
break;
}
c-> u.word的结构如下所示:
struct command
{
int status;
union
{
struct command *command[2];
char **word;
struct command *subshell_command;
} u;
};
printf ("%*s%s", indent, "", "true");
//abort();
while (*++w) // if next character is not null, keep printing.
printf (" %s", *w);
当我放弃abort();在printf函数之后,它打印出正确的输出。 但是,当我解除中止时,它不打印任何内容。 另外,printf函数后面的行“while(* ++ w)会导致无限循环,我相信条件 评估* ++ w,我认为它先评估++ w和* next。
w = w + 1; *瓦特;
如何摆脱这种循环?
答案 0 :(得分:2)
格式说明符很难在联机帮助页上阅读,我错过了'。'之前:
printf ("%*s%s", indent, "", *w);
应该是printf ("%.*s%s", indent, "", *w);
,字符串应该以'\ n'结尾,以防止它在stdout上保持缓冲(这就是为什么中止“修复”它)。
答案 1 :(得分:0)
您的char** w
表示w
是指向字符指针的指针,而不是指向字符的指针。
因此,当你执行while (*++w)
时,你不会超越字符,而是超过整个字符串(希望最后一个字符串为NULL)。
通常,您会在main(int argc, char** argv)
中看到这样的代码,其中字符串数组以NULL指针终止。
否则你的循环会崩溃。
另外,你真的打算做while(*w++)
,这样你也可以打印第一张照片吗?
回答评论:假设您有一个主程序main(int argc, char** argv)
,并使用此命令行调用该程序:
myprogram one two three
然后在程序中你会看到
argv[0] is "myprogram"
argv[1] is "one"
argv[2] is "two"
argv[3] is "three"
argv[4] == NULL so it is a null pointer. It does not point to a string.
所以,如果你有这个循环
while(char* w = *argv++){
printf("%s\n", w);
}
你应该看到
myprogram
one
two
three
它停止的原因是w
获取空指针,即0。
答案 2 :(得分:0)
通常,当您使用printf
打印内容时,它会被放置在缓冲区中。在刷新缓冲区之前,您实际上不会看到任何内容。您可以通过调用fflush(stdout)
显式刷新缓冲区,也可以更改缓冲模式。当输出到终端时,大多数C库默认为行缓冲,每次输出'\ n'(换行符)时都会隐式刷新缓冲区,因此如果向字符串添加\n
,您可能会看到一些内容你正在输出。