为什么要打印路径?

时间:2018-11-16 14:58:18

标签: c

我正在尝试寻找一个简单的代码,该代码要求输入一个单词,并在没有首字母的情况下重复该单词,直到单词为空 举个例子 :

hello
ello
llo
lo
o

我编写了一个很棒的代码:

#include <stdlib.h>
#include <stdio.h>


int main(){
    char* p=(char*)(malloc(50*sizeof(char)));
    scanf("%s",p);
    while (*p!='\0',printf("%s\n",++p)>1);
}

但是,在此之前,我首先尝试使用:while (*p!='\0',printf("%s\n",++p));的版本,当我尝试使用它时,它与输入的单词配合使用效果很好,但随后开始对我的PATH做同样的操作。所以我想知道为什么程序总是提示我的PATH吗?我在使用mingw的Windows 7 64位系统上。

谢谢!祝你有美好的一天!

1 个答案:

答案 0 :(得分:0)

这是因为the comma operator的工作原理。

它评估左侧和右侧,并丢弃左侧结果。这意味着条件*p != '\0'已被评估,但未使用结果。

取而代之的是printf函数的结果,该结果将被用作循环中的唯一条件。它将返回打印的字符数,其中包括,例如空格和换行符。而且,由于您打印换行符,返回的值将总是 至少为1。在C语言中,只有0被认为是错误的,并且会停止循环。

您应该使用逻辑AND运算符&&而不是逗号运算符:

while (*p!='\0' && printf("%s\n",++p));

现在,当左侧(即*p!='\0')变为假时,循环应停止。


如果没有上述更改或所做的更改,将会发生以下情况:循环将超出字符串甚至分配的内存范围。这导致undefined behavior,这意味着几乎所有事情都会发生。

对于您来说,似乎环境的一部分恰好位于您分配的内存中的下一个内存中。