尝试将字符串拆分为多个部分

时间:2012-06-14 10:41:18

标签: c

我有2个阵列:

data[256] = "1@2@3@4@5"
question[256][256];

我需要将@之前的数字拆分成数组。 例如:

question[0][] = 1
question[1][] = 2
question[2][] = 3
question[3][] = 4
question[4][] = 5

如果我有@或者没有。

,它就不会满足。

这就是我写的:

int i = 0, j = 0;
 data = "1@2@3@4@5";

 for (i = 0 ; i < strlen(data) ; i++)
 {
     for (j ; data[j] != '@' ; j++)
     {
         question[i][j] = data[j];
     }
     j++
 }

 printf ("%s\n", question);

问题是,它一直工作到第一个@,然后停止。 它只会对第一个@提出疑问,然后停止。 (基本上我应该得到相同的输出来打印数据和问题)。

3 个答案:

答案 0 :(得分:2)

有一些问题。

首先,printf仅打印字符串,直到第一个终止零字符('\0'),这发生在question中的第一个“部分”之后(即使还有其他部分。相反,您需要打印所有:

for (i=0; i<255; ++i) {
  printf("%s\n", question[i]);
}

确保以前对'\0'行进行空终止(question),因此不要为未初始化的行打印垃圾。或者只是维护最后一行的索引并迭代直到那个

此外,循环

for(j; data[j]!='@', j++)

将在第一个'@'处停止,并且外部循环的所有后续迭代将评估相同的j(这是'@'的索引,因此循环被进一步跳过迭代。你需要在内循环之后提前j

您还需要在最后j之后保留最后一个'@'位置才能计算上一个j '@'的位置,所以你可以正确索引到question[i]。在前一段中建议的额外提升之后,将lastj设置为j的值。此外,从现在开始,question的第二个索引应为j-lastj

关于内部循环的另一个问题是:它会在最后data之后超过'@'中的字符串,因此您还必须检查是否存在终止。< / p>

另外,请确保在question中空终止字符串,否则printf将产生垃圾(并且在到达未分配给您的程序的内存时可能会出现seg-fault)。写一下

question[i][j-lastj] = '\0';

内循环后。 (j将指向内循环末尾的最后一个写入索引)

还有一件事:不要迭代i直到data的长度,因为你不需要触及那么多元素(并且可能会在内循环中过度索引data) 。改为使用while循环,仅递增i,直到您在内循环中使用data覆盖j

注意:查找strtok,让您更轻松地进行标记化

答案 1 :(得分:0)

我会使用strchr之类的内容来获取下一个'@'的位置。

算法是这样的:你得到下一个'@'的位置,如果没有找到,则将next设置为字符串的末尾。然后从字符串的当前beginning复制到next位置到您想要的位置。记得终止复制的字符串!将字符串的beginning设置为next以外的值。重复,直到beginning超出数据结束。

编辑:我的解决方案的代码:

char *beg = data;
char *end = data + strlen(data);  /* Points to one beyond the end of 'data' */

for (int i = 0; beg < end; i++)
{
    char *next = strchr(beg, '@');  /* Find next '@' */
    if (next == NULL)
        break;  /* No more '@' */

    memcpy(question[i], beg, next - beg);  /* Copy to array */
    question[i][next - beg] = '\0';  /* Remember to terminate string */

    beg = next + 1;  /* Point to next possible number */
}

注意:未经测试。可能是复制之一,可能必须是next - beg - 1。 (即使经过25年的C编程,我似乎总是在第一次尝试时出错... :))

答案 2 :(得分:0)

有一种更简单的方法可以做到这一点。使用strtok"@"标记字符串,然后使用strcpy将标记化字符串复制到question数组中。例如(未测试):

char *pcur = data;
int i = 0;

do
{
  if ((pcur = strtok(pcur, "@")) != NULL)
  {
    strcpy(question[i], pcur++);
    printf ("%s\r\n", question[i++]);
  }
}
while (pcur != NULL);

如上例所示,递增i会将question数组索引移动到下一个位置,并且递增pcur会将标记化的字符串指针移过已停用的令牌以进行下一次迭代通过循环。

另见: