在strcpy(buffer_two,argv1)之后,我得到了分段错误;不确定这里出了什么问题,我希望能帮助我理解哪里出了问题,以及为什么我会出现分段错误。
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
int value = 5;
char buffer_one[8], buffer_two[8];
strcpy(buffer_one, "one"); // Put "one" into buffer_one
strcpy(buffer_two, "two"); // Put "two" into buffer_two
printf("[BEFORE] buffer_two is at %p and contains \'%s\'\n", buffer_two, buffer_two);
printf("[BEFORE] buffer_one is at %p and contains \'%s\'\n", buffer_one, buffer_one);
printf("\n[STRCPY] copying %d bytes into buffer_two\n\n", strlen(argv[1])); //Copy first argument into buffer_two
strcpy(buffer_two, argv[1]); // <---- here
printf("[After] buffer_two is at %p and contains \'%s\'\n", buffer_two, buffer_two);
printf("[After] buffer_one is at %p and contains \'%s\'\n", buffer_one, buffer_one);
printf("[AFTER] value is at %p and is %d (0x%08x)\n", &value, value, value);
}
发布于 2018-06-01 04:02:25
这里有两个主要问题:不检查argc
以查看argv[1]
是否存在,以及盲目地将argv[1]
复制到可能不足以容纳它的缓冲区中。我还修复了一些与printf语句相关的编译器警告。下面是一个示例,使用您的代码来说明如何处理这些事情:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
if(argc < 2) {
printf("Please enter an argument when invoking this program\n");
return EXIT_FAILURE;
}
int value = 5;
char buffer_one[8], buffer_two[8];
strcpy(buffer_one, "one"); // Put "one" into buffer_one
strcpy(buffer_two, "two"); // Put "two" into buffer_two
printf("[BEFORE] buffer_two is at %p and contains \'%s\'\n", (void *)buffer_two, buffer_two);
printf("[BEFORE] buffer_one is at %p and contains \'%s\'\n", (void *)buffer_one, buffer_one);
printf("\n[STRCPY] copying %zu bytes into buffer_two\n\n", strlen(argv[1])); //Copy first argument into buffer_two
strncpy(buffer_two, argv[1], 8); // <---- here
if(buffer_two[7] != '\0'){
printf("[ERROR] string did not fit into buffer, truncating\n");
buffer_two[7] = '\0';
}
printf("[After] buffer_two is at %p and contains \'%s\'\n", (void *)buffer_two, buffer_two);
printf("[After] buffer_one is at %p and contains \'%s\'\n", (void *)buffer_one, buffer_one);
printf("[AFTER] value is at %p and is %d (0x%08x)\n", (void *)&value, value, value);
}
发布于 2018-06-01 03:08:25
在使用argv之前,请检查argc值。仅当argc >1时才使用strcpy。在strcpy()之前创建条件语句
例如。
int main(int argv,char * argv[])
{
char buffer[10];
if (argc > 1 && strlen(argv[1]) < 10)
{
strcpy(&buffer[0],argv[1]);
}
return 0;
}
你应该通过以下方式运行程序
./a.out hai
hai是传递的参数。这里argc是2,argv1 = hai
https://stackoverflow.com/questions/50631142
复制相似问题