unix C系统()函数

4jb9z9bj  于 2022-11-04  发布在  Unix
关注(0)|答案(3)|浏览(166)

我尝试在Linux中创建一个文件,并在C程序中使用system()函数给予它可执行权限。代码如下:


# include<stdio.h>

# include<stdlib.h>

# include<string.h>

int main(int argc, char *argv[], char *envp[]){
char s[100];
strcpy(s, "touch ");
strcpy(s, argv[1]);
strcpy(s, "; chmod a+x ");
strcpy(s, argv[1]);
system(s);
return 0;
}

但是,当我用参数“abs”调用编译后的文件时,例如(假设我希望“abs”作为要创建的文件的名称),它会给出这样的输出:

sh: 1: abs: not found

如何修复?这是很重要的,我必须使用C编程和system()函数。

6fe3ivhb

6fe3ivhb1#

看来这个答案对于未来的读者来说是无法理解的,让我试着解释一下strcpystrcat之间的区别

***strcpy()**将一个字符串复制到另一个字符串中。
***strcat()**函数通过将源字符串追加到目标字符串来连接字符串。

在原始代码中,每次调用“strcpy”函数时,缓冲区中的前一个值都会被覆盖。

char s[100];
strcpy(s, "touch "); // s = touch
strcpy(s, argv[1]); // s = abc (argv[1] value)
strcpy(s, "; chmod a+x "); // s = ; chmod a+x 
strcpy(s, argv[1]); // s = abc (argv[1] value)
system(s); // execute s = abc

最后,由于“s”是“abc”,system()函数尝试执行它,这将产生以下错误:

sh: 1: abs: not found

在修改后的版本中,新值将追加到缓冲区中,而不是覆盖以前的值。

char s[100];
strcpy(s, "touch "); // s = touch
strcat(s, argv[1]); // s = touch abc
strcat(s, "; chmod a+x "); // s = touch abc; chmod a+x
strcat(s, argv[1]); // s = touch abc; chmod a+x abc
system(s); // execute s = touch abc; chmod a+x abc
ukqbszuj

ukqbszuj2#

strcpy将字符串复制到另一个字符串,使用strncat(3)连接字符串。

您的代码应该如下所示:


# include<stdio.h>

# include<stdlib.h>

# include<string.h>

# define ARRAY_SIZE(X) sizeof(X)/sizeof(X[0])

int main(int argc, char *argv[], char *envp[]){
    char s[100];
    strncat(s, "touch ", ARRAY_SIZE(s) - 1 - strlen(s));
    strncat(s, argv[1], ARRAY_SIZE(s) - 1 - strlen(s));
    strncat(s, "; chmod a+x ", ARRAY_SIZE(s) - 1 - strlen(s));
    strncat(s, argv[1], ARRAY_SIZE(s) - 1 - strlen(s));
    system(s);
    return 0;
}
e0bqpujr

e0bqpujr3#

该代码应更改为以下代码:


# include<stdio.h>

# include<stdlib.h>

# include<string.h>

int main(int argc, char *argv[], char *envp[]){
char s[100];
strcpy(s, "touch "); //s = "touch "
strcat(s, argv[1]); //s = "touch " + argv[1]
strcat(s, "; chmod a+x "); //s = "touch " + argv[1] + "; chmod a+x " 
strcat(s, argv[1]); //s =  "touch " + argv[1] + "; chmod a+x " + argv[1]
system(s); //system("touch " + argv[1] + "; chmod a+x " + argv[1])
return 0;
}

非常感谢评论员!

相关问题