我正在尝试寻找一个简单的代码,该代码要求输入一个单词,并在没有首字母的情况下重复该单词,直到单词为空
举个例子 :
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位系统上。
谢谢!祝你有美好的一天!
答案 0 :(得分:0)
这是因为the comma operator的工作原理。
它评估左侧和右侧,并丢弃左侧结果。这意味着条件*p != '\0'
已被评估,但未使用结果。
取而代之的是printf
函数的结果,该结果将被用作循环中的唯一条件。它将返回打印的字符数,其中包括,例如空格和换行符。而且,由于您打印换行符,返回的值将总是 至少为1
。在C语言中,只有0
被认为是错误的,并且会停止循环。
您应该使用逻辑AND运算符&&
而不是逗号运算符:
while (*p!='\0' && printf("%s\n",++p));
现在,当左侧(即*p!='\0'
)变为假时,循环应停止。
如果没有上述更改或所做的更改,将会发生以下情况:循环将超出字符串甚至分配的内存范围。这导致undefined behavior,这意味着几乎所有事情都会发生。
对于您来说,似乎环境的一部分恰好位于您分配的内存中的下一个内存中。