我有一个问题,我必须连接偶数位置的变量,到前面的奇数位置的变量,所以到偶数上面的变量。
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,但是它会比手动字符串操作快得多,就像在环境中循环并手动获取'='字符后面的值一样。
1条答案
按热度按时间6za6bjd01#
在代码片段中:
字符串
你尝试在
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开始,而且,你检查偶数索引,所以请在你的问题中澄清。据了解,如果你谈论的是数组位置,第一个将是奇数(你必须把第二个位置-偶数-加到第一个位置上,但是奇数位置有偶数索引,偶数位置有奇数索引,记住)偶数位置的环境变量应该发生什么?什么都没有。还有,输出必须如何格式化。这也不清楚。
恕我直言,如果你必须将偶数位置的值连接到奇数位置的环境变量,你实际上不需要在程序中做任何连接,你只需要完整地打印奇数位置的变量,然后打印偶数位置变量的 * 值 *,使连接实际上发生在输出中:
型
如果你想分开这两个部分(用类似
">>><<<"
的东西来标记值连接的位置,只要改变型
通过
型
你会得到这样的东西:
型
(see由于变量的数量是奇数,最后一个变量没有连接到下一个变量)