c - strtok - 如何避免换行并放入字符串数组?

标签 c arrays string split strtok

如果我欺骗了主题,我真的很抱歉,我在这里搜索但没有结果。 我有代码

void split(char* str, char* splitstr)
{
     char* p;
     char splitbuf[32];
     int i=0;
     p = strtok(str,",");
     while(p!= NULL)
     {
               printf("%s", p);    
               sprintf(&splitstr[i],"%s",p);
               i++;
               p = strtok (NULL, ",");

     }
}

如何使用正确的 sprintf 将 strtok 分割的单词放入字符串数组? 我可以以某种方式避免 strtok 创建的断线吗? 我正在使用 ANSI C 进行编程。我以相同的方式声明了数组 splitstr 和 str。

char* splitstr;//in main char splitstr[32];

感谢您的帮助。


编辑:

i would like do something like this:
INPUT (it is a string) > "aa,bbb,ccc,ddd"
I declare: char tab[33];
OUTPUT (save all items to array of strings if it is even possible) > 
tab[0] is "aa"
tab[1] is "bbb"
...
tab[3] is "ddd" but not "ddd(newline)"

编辑2 [18:16]

我忘记添加数据字符串来自读取文件行。这就是为什么我写了“ddd(换行符)”。我发现之后 strtok 也显示了新行,但作为另一个项目显示。顺便说一句,所有答案都有助于思考问题。几秒钟前,我的笔记本电脑坏了(我不知道为什么屏幕变黑),一旦我控制了我的电脑,我就会检查代码。 :-)

最佳答案

试一下:

#include <stdlib.h>
#include <string.h>
...
void split(char *str, char **splitstr) 
{      
  char *p;      
  int i=0;      

  p = strtok(str,",");      
  while(p!= NULL)      
  {                
    printf("%s", p);
    splitsr[i] = malloc(strlen(p) + 1);
    if (splitstr[i])
      strcpy(splitstr[i], p);
    i++;
    p = strtok (NULL, ",");       
  } 
}

然后,在main中:

#define MAX_LEN  ... // max allowed length of input string, including 0 terminator
#define MAX_STR  ... // max allowed number of substrings in input string

int main(void)
{
  char input[MAX_LEN]; 
  char *strs[MAX_STR] = {NULL}; 
  ...
  split(input, strs);
  ...
}

一些解释。

strsmain 中定义为指向 char 的指针数组。每个数组元素将指向从输入字符串中提取的字符串。在 main 中,分配的只是指针数组,每个元素最初都是 NULL;每个元素的内存将在 split 函数中使用 malloc 根据子字符串的长度进行分配。 某处在完成 strs 后,您需要使用 free 释放这些指针:

for (i = 0; i < MAX_STR; i++)
  free(strs[i]);

现在,为什么 splitstr 声明为 char ** 而不是 char *[MAX_STR]?除非它是 sizeof& 运算符的操作数,或者是用于在声明中初始化另一个数组的字符串文字,否则数组表达式将隐式具有其类型从T的N元素数组转换为指向T的指针,表达式的值将是数组中第一个元素的位置。

当我们调用split时:

split(input, strs);

数组表达式input从类型char [MAX_LENGTH]隐式转换为char *(T == char code>),数组表达式 strs 从类型 char *[MAX_STRS] 隐式转换为 char ** (T == 字符*)。因此,splitstr 接收两个参数的指针值,而不是数组值。

关于c - strtok - 如何避免换行并放入字符串数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5156119/

相关文章:

c - 如何将 libnet 与 cmake(和 kdevelop)一起使用?

javascript hackerranks sherlock 和数组性能问题

c - 为什么我在显示数据后得到垃圾值

Java:从字节数组中删除第一个UTF字符串

c - 如何在 Oracle 中对 XMLType 列使用 OCI?

c - 加密解密错误(一次性一密加密)

在数组中转换 void 类型指针

Java 8 : Why can't I parse this binary string into a long?

c++ - 'std::string' 没有名为 'get' list[i]=user.get 的成员;

Python:从字符串中打印特定字符