Unix strcmp为什么不';不行?

Unix strcmp为什么不';不行?,unix,process,popen,strcmp,Unix,Process,Popen,Strcmp,该程序运行良好。它验证参数是文件还是目录,并返回1或2。然而,strcmp不起作用,我不知道为什么 这是我的密码: #定义N 100 int main(int argc,char*argv[]){ 文件*fp; char cmd[N]; 字符结果[N]; int i; 对于(i=1;i变量x还没有值 你的意思是说以下内容吗 if (strcmp(result,"1")==0){ //DO SOMETHING } 除了问题中的变量混淆外,请注意阅读一行文本时尾随

该程序运行良好。它验证参数是文件还是目录,并返回1或2。然而,
strcmp
不起作用,我不知道为什么

这是我的密码:

#定义N 100
int main(int argc,char*argv[]){
文件*fp;
char cmd[N];
字符结果[N];
int i;

对于(i=1;i变量
x
还没有值

你的意思是说以下内容吗

if (strcmp(result,"1")==0){
                 //DO SOMETHING
}

除了问题中的变量混淆外,请注意阅读一行文本时尾随的换行符会发生什么情况。摘自linux手册页fgets(3):

我写了一个有点像你的小程序:

#include <stdio.h>

main()
{
  FILE      *fp;
  char bigbuf[10*1024];

  fp = popen("/bin/echo hello world", "r");
  fgets(bigbuf, sizeof bigbuf, fp);

  printf("length of bigbuf: %d\nlength of \"hello world\": %d\n", strlen(bigbuf), strlen("hello world"));
  exit(0);
}

result
有一个终止换行符,因为它已被
fgets()
读取,因此,它将包含
“1\n”
(或者可能是
“1\r\n”
,尽管这不太可能),这与
“1”
不同

可以按如下方式删除换行符:

char *p;
if((p=strchr(result,'\n'))!=0) *p=0;

如果您的输入包含CR,您可以以相同的方式删除它们。

请复制并粘贴您的确切代码到问题中。
\DEFINE
将是语法错误;拼写为
\DEFINE
管道(c2p)什么是c2p?为什么会泄漏?对不起,我忘了删除那个部分是的,我想这就是问题所在,但我不知道如何删除那些字符…为什么它会包含
“1\r\n”
而不是
“1\n”
?文件补丁
“/home/flory/os/verif.sh”
强烈暗示类似UNIX的系统。但即使在Windows上,如果流处于文本模式,任何行尾标记都将自动转换为单个
'\n'
字符。@Keith这取决于popen()启动的进程使用的行尾.Unix程序通常使用als行结尾,而Windows程序则使用\r\n。因此,虽然verif.sh听起来像Unix shell脚本,但没有人阻止它生成Windows行结尾。例如,如果verif.sh的输出也将在Windows上使用,则可能会出现这种情况。因此,虽然我不太可能为了完整性而提到\r\n。这是问题。我使用strtok截断到“\n”,现在我的程序正在运行
length of bigbuf: 12
length of "hello world": 11
char *p;
if((p=strchr(result,'\n'))!=0) *p=0;