c - 将c字符串解析为指针数组时出现段错误

标签 c arrays pointers segmentation-fault

函数 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/

相关文章:

c - 从共享对象文件 (.so) 获取函数返回类型和参数

java - 指向 Java 的 ANSI C 指针

arrays - 在 swift 中将 var 声明为一个组

c++ - gdb 的奇怪行为

c - 我的未分配指针将指向这里什么?

c - 如何修改此结构中的字符数组 ~> C

c - 使用 Visual Studio 2010 在 C 中返回失败类型

java - 获取二维数组的最大值

javascript - Node.js v8 HOLEY 数组意外行为

c++ - 如何将 vector 作为函数参数传递给指针