C语言 为什么所有的环境变量都是空的

t3irkdon  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(164)

我有一个问题,我必须连接偶数位置的变量,到前面的奇数位置的变量,所以到偶数上面的变量。
ps忘了提par在罗马尼亚语中是偶数的意思,impar是奇数的意思

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

int main()
{
  extern char **environ;
  char **env=environ;

  printf("Environment initial\n");
  for(int i=0;env[i]!=NULL;i++)
  {
    printf("%s\n",env[i]);
  }

  for(int i=2;env[i]!=NULL;i++)
  {
    if(i%2==0)
    {
      char *sir_par=env[i];
      char *sir_imp=env[i-1];
      char *var_par=getenv(sir_par);
      if(var_par==NULL)
      {
        fprintf(stderr,"%s\n","Eroare la obtinerea variabilei de pe pozitie para\n");
        exit(1);
      }
      char *var_imp=getenv(sir_imp);
      if(var_imp==NULL)
      {
        fprintf(stderr,"%s\n","Eroare la obtinerea variabilei de pe pozitie impara\n");
        exit(1);
      }
      char *var_nou;
      var_nou=malloc(strlen(var_imp)+strlen(var_par)+1);
      if(var_nou==NULL)
      {
        perror("Eroare la alocarea memoriei\n");
        exit(1);
      }
      strcpy(var_nou,var_imp);
      strcat(var_nou,var_par);
      if(setenv(sir_imp,var_nou,1)==-1)
      {
        perror("Eroare la modificarea variabilei de environment de pe pozitie impara\n");
        exit(1);
      }
      free(var_nou);
    }
  }

  printf("Environment dupa prelucrare\n");
  for(int i=0;env[i]!=NULL;i++)
  {
    printf("%s\n",env[i]);
  }

  return 0;
}

字符串
我这样做,并得到分段故障,然后测试getenv和setenv,并在第一getenv得到错误,所以我这样做

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

int main()
{
  extern char **environ;
  char **env=environ;

  printf("Environment initial\n");
  for(int i=0;env[i]!=NULL;i++)
  {
    printf("Environment: %s\n",env[i]);
    if(i%2==0){
    char *par=getenv(env[i]);
    printf("\n\n Variabila:\n%s\n\n",par);
  }
  }

  return 0;
}


它正确地打印环境,但每次到达偶数位置时都会打印(null)
我不需要使用getenv和setenv,但是它会比手动字符串操作快得多,就像在环境中循环并手动获取'='字符后面的值一样。

6za6bjd0

6za6bjd01#

在代码片段中:

printf("Environment initial\n");
  for(int i=0;env[i]!=NULL;i++)
  {
    printf("Environment: %s\n",env[i]);
    if(i%2==0){
    char *par=getenv(env[i]);
    printf("\n\n Variabila:\n%s\n\n",par);
  }

字符串
你尝试在env[i]中使用完整的字符串getenv()(* 是变量名,与'='字符和环境变量值连接在一起 *)这将使函数失败(因为你没有使用变量名,但两者都有,没有变量名可以在它的名字中有'='),所以它总是返回NULL,这就是为什么要像这样打印环境中的所有变量。
举个例子来说明你的错误:
如果PATH=/bin:/usr/bin:/usr/local/bin作为environ字符串,则以下情况为真:

  • getenv("PATH")将返回正确的值"/bin:/usr/bin:/usr/local/bin"
  • getenv("PATH=/bin:/usr/bin:/usr/local/bin")将返回NULL,因为环境中不存在以这种方式命名的变量。

如果你阅读getenv(3)的手册页,你会发现如果你请求一个不存在的变量,函数会返回NULL
顺便说一句,你的问题在问题中没有得到适当的解释,正如你所说:
i必须将偶数位置的变量连接到前面的奇数位置的变量
但在这种情况下,第一个位置是0(这是偶数),所以,我们应该把这个值附加到位置-1吗?一开始并不清楚该怎么做。也许你的意思是 * 在奇数索引的位置 *(这些有奇数索引,但实际上是偶数位置)但这并不清楚,因为你从索引2开始,而且,你检查偶数索引,所以请在你的问题中澄清。据了解,如果你谈论的是数组位置,第一个将是奇数(你必须把第二个位置-偶数-加到第一个位置上,但是奇数位置有偶数索引,偶数位置有奇数索引,记住)偶数位置的环境变量应该发生什么?什么都没有。还有,输出必须如何格式化。这也不清楚。
恕我直言,如果你必须将偶数位置的值连接到奇数位置的环境变量,你实际上不需要在程序中做任何连接,你只需要完整地打印奇数位置的变量,然后打印偶数位置变量的 * 值 *,使连接实际上发生在输出中:

#include <stdio.h>
#include <string.h>

int main()
{
    int i;
    extern char **environ;
    for (i = 0; environ[i]; i++) {
        if (i % 2 == 0) { /* odd position, even index */
            printf("%s", environ[i]); /* print the variable */
            if (environ[i + 1]) { /* if next position exists */
                /* search for the position of the '=' char */
                char *val = strchr(environ[i + 1], '=');
                if (val) {
                    /* print the value of the even positioned
                     * value at val + 1 */
                    printf("%s", val + 1); /* print the next value */
                }
            }
            printf("\n"); /* end the line */
        }
    } /* for */
    return 0;
} /* main */


如果你想分开这两个部分(用类似">>><<<"的东西来标记值连接的位置,只要改变

printf("%s", val + 1); /* print the next value */


通过

printf(">>><<<%s", val + 1); /* print the next value */


你会得到这样的东西:

SHELL=/usr/local/bin/bash>>><<<18874380
CVSROOT=/home/cvsroot>>><<</usr/lib/pkgconfig
XTERM_VERSION=XTerm(384)>>><<</usr/local/bin/bash
EDITOR=vi>>><<</home/lcu
MAKEOBJDIRPREFIX=/home/lcu/obj>>><<<lcu
MANPATH=/home/lcu/man:>>><<<Europe/Helsinki
WINDOWPATH=9>>><<<.:/home/lcu
HOME=/home/lcu>>><<<es_ES.UTF-8
XTERM_LOCALE=es_ES.UTF-8>>><<<xterm
USER=lcu>>><<<:0
FORTUNE_PATH=/home/lcu/.fortune:/usr/share/games/fortune:/usr/local/share/games/fortune>>><<<1
PAGER=less -r>>><<<UTF-8
LD_LIBRARY_PATH=/home/lcu/lib:>>><<</home/lcu/bin:/home/lcu/bin:/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin
BLOCKSIZE=K>>><<</var/mail/lcu
_=./pru1660


(see由于变量的数量是奇数,最后一个变量没有连接到下一个变量)

相关问题