printf函数产生意外的输出

时间:2013-10-07 18:51:56

标签: c

我正在尝试执行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; *瓦特;

如何摆脱这种循环?

3 个答案:

答案 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,您可能会看到一些内容你正在输出。