函数 makearg 应该计算 char 数组中的单词数,并将每个单词分解到指针数组中自己的位置。 段错误似乎是 strncpy 函数的问题。
int makearg(char s[], char ***args);
int main(){
char **args = (char**)(malloc(100));
char *str = "ls is a -l file";
int argc;
argc = makearg(str, &args);
printf("%d", argc);
printf("%c", '\0');
int i;
for(i = 0; i < argc; i++){
puts(args);
printf("%c", '\n');
}
return 0;
}
/////////////////////////////////////////
int makearg(char s[], char ***args){
int argc = 0;
int charc = 0;
int wordstart = 0;
while(1){
if(s[charc] == '\0'){
strncpy(*args[argc], s + wordstart, charc - wordstart);
args[argc][(charc - wordstart) + 1] = '\0';
argc++;
break;
}
if(s[charc] == ' '){
strncpy(*args[argc], s + wordstart, charc - wordstart);
args[argc][(charc - wordstart) + 1] = '\0';
wordstart = charc + 1;
argc++;
charc++;
}
else{
charc++;
}
}
return argc;
}
最佳答案
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int makearg(const char s[], char ***args);
int main(void){
char **args = NULL;
const char *str = "ls is a -l file";
int argc = makearg(str, &args);
printf("argc : %d\n", argc);
int i;
for(i = 0; i < argc; i++){
puts(args[i]);
free(args[i]);
}
free(args);
return 0;
}
int wordCount(const char *s){
char prev = ' ';
int wc = 0;
while(*s){
if(isspace(prev) && !isspace(*s)){
++wc;
}
prev = *s++;
}
return wc;
}
int makearg(const char s[], char ***args /*out*/){
int argc = wordCount(s);
int len;
if(argc == 0){
*args = NULL;
return 0;
}
*args = malloc(argc * sizeof(char*));
argc = 0;
while(1){
while(isspace(*s))
++s;
if(EOF==sscanf(s, "%*s%n", &len))
break;
(*args)[argc] = malloc(len + 1);
strncpy((*args)[argc], s, len);
(*args)[argc++][len] = '\0';
s += len;
}
return argc;
}
关于c - 将c字符串解析为指针数组时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25798468/