2

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

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];

感谢帮助。


编辑:

我想做这样的事情:
INPUT (它是一个字符串) > "aa,bbb,ccc,ddd"
我声明:char tab[33];
输出(如果可能,将所有项目保存到字符串数组)>
选项卡 [0] 是“aa”
选项卡 [1] 是“bbb”
...
tab[3] 是 "ddd" 但不是 "ddd(newline)"

编辑2 [18:16]

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

4

3 回答 3

1

如果我理解正确,您想保存 strtok 获得的字符串。在这种情况下,您需要将 splitstr 声明为 char[MAX_LINES][32] 并使用 strcpy,如下所示:

strcpy(splitstr[i], p);

其中 i 是使用 strtok 读取的第 i 个字符串。

于 2011-03-01T15:09:16.060 回答
1

请注意,我不是 ansi C 专家,更多的是 C++ 专家,但这里是工作代码。它使用固定大小的数组,这可能是也可能不是问题。做其他事情需要更复杂的内存管理:

/* Not sure about the declaration of splitstr here, and whether there's a better way.
   char** isn't sufficient. */
int split(char* str, char splitstr[256][32])
{
   char* p;
   int i=0;
   p = strtok(str,",");
   while(p) {
   strcpy(splitstr[i++], p);
       p = strtok (NULL, ",");
   }
   return i;
}

int main(int argc, char* argv[])
{
 char input[256];
  char result[256][32];
  strcpy(input, "aa,bbb,ccc,ddd");
  int count = split(input, result);

  for (int i=0; i<count; i++) {
    printf("%s\n", result[i]);
  }
      printf("the end\n");
}

请注意,我输入 "aa,bbb,ccc,ddd" 并输出 {"aa", "bbb", "ccc", "ddd" }。结果没有换行符。

于 2011-03-01T15:54:40.350 回答
1

试一试:

#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);
  ...
}

一些解释。

strs被定义main为指向 的指针数组char。每个数组元素将指向从输入字符串中提取的字符串。在 main 中,所有分配的都是指针数组,每个元素最初为 NULL;每个元素的内存将根据子字符串的长度 在split函数内使用分配。完成后的某个地方,您需要使用以下方法释放这些指针:mallocstrsfree

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

现在,为什么splitstr声明为char **而不是char *[MAX_STR]?除非它是sizeofor&运算符的操作数,或者是用于在声明中初始化另一个数组的字符串文字,否则数组表达式的类型将隐式转换为N-element array of Tto pointer to T,表达式的值将是数组中的第一个元素。

当我们打电话时split

split(input, strs);

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

于 2011-03-01T20:25:48.467 回答