【问题标题】:Why strcmp doesn't work?为什么 strcmp 不起作用?
【发布时间】:2015-04-21 21:44:31
【问题描述】:

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

这是我的代码:

#DEFINE N 100
int main(int argc,char* argv[]) {

FILE *fp;
char cmd[N];
char result[N];
int i;

for(i=1;i<argc;i++){
    pipe(c2p);
    if (fork()==0){
        //Running the shell script
            sprintf(cmd,"/home/flory/os/verif.sh %s", argv[i]);
            fp = popen(cmd, "r");
            fgets(result, N, fp);
            pclose(fp);
            printf("%s",result);    
            if (strcmp(result,"1")==0){
                     //DO SOMETHING
            }
}

【问题讨论】:

  • 请将您的准确代码复制并粘贴到问题中。 #DEFINE 是语法错误;拼写为#define
  • pipe(c2p); 什么是 c2p ?为什么会泄漏?
  • 对不起,我忘了删除那部分

标签: unix process popen strcmp


【解决方案1】:

变量x 还没有值。

您的意思是以下吗?

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

【讨论】:

    【解决方案2】:

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

       fgets() reads in at most one less than size characters from stream  and
       stores  them  into  the buffer pointed to by s.  Reading stops after an
       EOF or a newline.  If a newline is read, it is stored into the  buffer.
       A '\0' is stored after the last character in the buffer.
    

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

    #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);
    }
    

    运行它,我得到以下输出:

    length of bigbuf: 12
    length of "hello world": 11
    

    【讨论】:

      【解决方案3】:

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

      你可以像这样删除换行符:

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

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

      【讨论】:

      • 是的,我认为这是问题所在,但我不知道如何删除这些字符...
      • 为什么会包含"1\r\n"而不是"1\n"?文件补丁"/home/flory/os/verif.sh" 强烈暗示了一个类UNIX 系统。但即使在 Windows 上,如果流处于文本模式,任何行尾标记都会自动转换为单个 '\n' 字符。
      • @Keith 这取决于 popen() 启动的进程使用的行尾。 Unix 程序通常使用 \n 作为换行符,而 Windows 程序则使用 \r\n。因此,虽然 verif.sh 听起来像一个 unix shell 脚本,但没有人阻止它生成 Windows 行尾。例如,如果 verif.sh 的输出也将在 Windows 上使用,则可能会出现这种情况。因此,虽然不太可能,但我只是为了完整性而提到了 \r。
      • 这就是问题所在。我使用 strtok 截断直到“\n”,现在我的程序正在运行
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-12
      • 2020-03-18
      • 1970-01-01
      • 2016-07-17
      相关资源
      最近更新 更多