1

我有 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);

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

4

3 回答 3

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在 last 之后维护一个 last-position'@'以便能够j从 last计算位置'@',以便您可以正确索引question[i]。设置lastjjafter 的值是上一段中建议的额外进步。另外,第二个索引question应该是j-lastj从现在开始。

关于内部循环的另一件事:事实上,它会data在 last 之后通过字符串'@',因此您还必须检查 noll-termination。

另外,请确保您以空值终止 中的字符串question,否则printf会产生垃圾(并且在到达未分配给程序的内存时可能会出现段错误)。写吧

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

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

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

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

于 2012-06-14T10:52:13.273 回答
0

我会使用类似的东西strchr来获取下一个的位置'@'

算法是这样的:你得到 next 的位置'@',如果没有找到,则设置next到字符串的末尾。beginning然后从字符串的当前位置复制next到您想要的位置。记得终止复制的字符串!将beginning字符串的 设置为超过 1 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 编程,我似乎总是在第一次尝试时就弄错了...... :))

于 2012-06-14T11:01:42.887 回答
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);

如上例所示,递增iquestion数组索引移动到下一个位置,递增pcur将标记化的字符串指针移过空标记,以通过循环进行下一次迭代。

也可以看看:

于 2012-06-14T13:52:12.330 回答