0

我还是 C 的新手。我正在做一个环境变量任务,我在处理我的字符串时遇到了问题。我想传递一个表示环境变量的变量,如果该字符串与环境键相同,则将具有 ${...} 的值替换为环境值。以下是代码:

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

void replace_env(char *string, char *env)
{
    int y = 0;
    int x = 0;
    int j = 0;
    int i = 0;
    int n = 0;
    int val_length;
    int location2[100];
    char *tmp3[BUFSIZ];
    char env_key[BUFSIZ];
    char env_val[BUFSIZ];
    char env_var[sizeof(env)][BUFSIZ];
    char user_input[BUFSIZ];
    char final_string[BUFSIZ];
    char tmp_key[100][BUFSIZ];

    tmp3[x]=env;
    strncpy(env_var[x],tmp3[x],sizeof(tmp3));

    for(x=0;env_var[y][x] != '=';x++)    //this is to get the environment key
    {
            env_key[x] = env_var[y][x];
    }
    x++;
    for(j=0;env_var[y][j] != '\0';j++)    //this is to get the environment value
    {
            env_val[j]=env_var[y][x];
            x++;
    }
    val_length = strlen(env_val);
    j=0;
    y=0;
    strncpy(user_input,string,sizeof(user_input));

    for(x = 0;user_input[x] !='\0';x++)
    {
     if (user_input[x] =='$')
      {
        x++;
        if(user_input[x] == '{')
         {
           x++;
           y=0;
           while(user_input[x]!='}')
           {
             tmp_key[i][y] = user_input[x];
             x++;
             y++;
           }
          i++;
          }
       }
    }
    tmp_key[i][y]='\0';
    i=0;
    for(x = 0;user_input[x] !='\0';x++)    //I think my problem is starting from here.
    {
     if (user_input[x] !='$')
      {
       final_string[j]=user_input[x];
       j++;
      }
      else
          {
           x++;
           if((user_input[x]== '{')&&(strncmp(tmp_key[i],env_key,sizeof(tmp_key))==0))
           {
            while(user_input[x]!='}')
            {
             x++;
            }
            strcat(final_string,env_val);
            j=j+val_length;
           }
           else    
              {
                final_string[j]=user_input[x];
                j++;
              }
         }
    }
    printf("output result = %s \n",final_string);
}

int main() {
    char s[100];
    sprintf(s, "jack${ABC}zack${DEF}");
    replace_env(s, "ABC=/home/fikrie/Documents");
    replace_env(s, "DEF=/tmp");
    if (strcmp(s, "jack/home/fikrie/Documentszack/tmp")==0) {
            printf("pass\n");
    } else {
            printf("fail\n");
    }
    printf("--------------------------------------------------------\n");

return 0;
}

为了更清楚,结果如下:

env_var = ABC=/home/fikrie/Documents 
env_key = ABC 
env_val = /home/fikrie/Documents 
input = jack${ABC}zack${DEF} 
after strcat result is = jack/home/fikrie/Documents 
j value is 26 
after strcat result is = jack/home/fikrie/Documentszack/home/fikrie/Documents 
j value is 52 
output result = jack/home/fikrie/Documentszack/home/fikrie/Documents 
env_var = DEF=/tmp 
env_key = DEF 
env_val = /tmp 
input = jack${ABC}zack${DEF} 
output result = jack{ABC}zack{DEF}ocumentszack/home/fikrie/Documents 
fail
--------------------------------------------------------

如您所见,ABC 被发送到 replace_env 函数中。它确实正确替换了 ${ABC},然后是一个字符串 zack。然后问题发生在 ${DEF} 被替换为 ABC 键而不是维护为 ${DEF}

在第二次调用 replace_env 函数期间发送 DEF 时,事情变得更加奇怪。ABC 和 DEF 都无法识别。更糟糕的是,后面的角色还在。

我的期望是:

For the first call of replace_env:
jack/home/Fikrie/Documentszack${DEF}

For the second call of replace_env:
jack/home/Fikrie/Documentszacl/tmp

after the strcmp passed, the final_string will be cleared again.

非常感谢所有帮助。我不期待答案。我更喜欢知识或指导,而不是茫然地解决它。只需要对我的错误做出明确的解释,因为我已经编辑这段代码将近一个月了,现在一切看起来都很模糊。我知道有一些方法可以使用内存函数、分配等来解决它。但是这个任务是关于字符串操作的。我在 Ubuntu 操作系统上运行它。对不起,我的英语不好。

4

1 回答 1

1

我知道你没有要求这个,但考虑一下。学习 C 字符串函数值得您花时间。

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

void sub(char *s, char *env, char *value) {
        char buf[BUFSIZ], *src = s, *dst = buf;
        int n = strlen(env);
        while(*src) {
                if(strncmp(src, env, n) == 0) {
                        dst += strlen(strcpy(dst, value));
                        src += strlen(env);
                } else {
                        *dst++ = *src++;
                }
        }
        *dst = 0;
        strcpy(s, buf);
}

void replace_env(char *s, char *env) {
        char copy[BUFSIZ], tmp[BUFSIZ];
        strcpy(copy, env);
        char *eq = strchr(copy, '=');
        if(eq == 0) {
                printf("No '=' found in '%s'\n", env);
                return;
        }
        *eq = 0;
        sprintf(tmp, "${%s}", copy);
        sub(s, tmp, eq+1);
}

int main() {
    char s[100];
    sprintf(s, "jack${ABC}zack${DEF}");
    replace_env(s, "ABC=/home/fikrie/Documents");
    replace_env(s, "DEF=/tmp");
    if (strcmp(s, "jack/home/fikrie/Documentszack/tmp")==0) {
            printf("pass\n");
    } else {
            printf("fail\n");
    }
    printf("--------------------------------------------------------\n");
    return 0;
}
于 2013-11-08T04:37:18.577 回答