我试图弄清楚为什么在尝试将参数从一个字符串复制到另一个字符串的参数时会得到分段错误,而只是忽略了>
int main(){
char *args[] = {"sort", "myshell.c", ">", "2"};
int size = 4*sizeof(args)/sizeof(args);
char *temp[size];
int i;
printf("SIZE: %dn", size);
for(i = 0; i < size; ++i){
if(strcmp(args[i], ">") > 0 || strcmp(args[i], ">") < 0 ){
strcpy(temp[i],args[i]);
}
printf("arg: %sn", temp[i]);
}
strcpy(temp[i],args[i]);
这是未定义的行为。strcpy
试图访问不确定的内存位置,导致不确定的行为。
您需要将内存分配给temp[i]
或简单地使用
temp[i]=strdup(args[i])
将字符串复制到temp[i]
。
也
int size = 4*sizeof(args)/sizeof(args);
将是
int size = sizeof(args)/sizeof(*args);
如果您知道数组的长度为4,那么完成所有这些计算的用途是什么?您需要计算它不是那样的。
示例代码: -
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void){
char *args[] = {"sort", "myshell.c", ">", "2"};
size_t size = sizeof(args)/sizeof(*args);
char *temp[size];
size_t len = 0;
printf("SIZE: %zun", size);
for(size_t i = 0; i < size; ++i){
if(strcmp(args[i], ">") != 0 ){
temp[len++] = args[i];
}
}
for(size_t i = 0; i < len; i++){
printf("arg[%zu]: %sn", i+1, temp[i]);
}
return 0;
}
请注意,您的比较应该如上所述更简单。
strdup
做什么?
内部分配内存,然后使用strcpy
复制目标字符串。这不是标准库的一部分,而是由POSIX实施。有关更多详细信息,请查看此答案。
您的代码在strcpy(temp[i],args[i]);
上崩溃,因为temp[i]
具有非初始化的值。您需要分配内存并将地址存储在temp[i]
中,然后再致电strcpy
-
您正在尝试将数据(在这种情况下为字符串)复制到由临时[i]指向的内存中 - 但是该指针是非初始化的,并且没有分配内存。您应该分配内存:
temp[i] = (char )malloc(sizeof(char)(strlen(args[i])+1))
-
要忽略">",您可以对!= 0进行测试。您需要复制字符串的辅助索引。
-
sizeof(args)/sizeof(args)的目的是什么?尝试:
int main() { char *args[] = {"sort", "myshell.c", ">", "2"}; int size = sizeof(args)/sizeof(char *); char *temp[size]; int i, j; printf("SIZE: %dn", size); for (j = 0, i = 0; i < size; ++i) { if (strcmp(args[i], ">") != 0) { temp[j] = (char *)malloc(sizeof(char)*(strlen(args[i])+1)); strcpy(temp[j],args[i]); printf("arg: %sn", temp[j]); j++; } } }