我有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);
问题是,它一直工作到第一个@
,然后停止。
它只会对第一个@
提出疑问,然后停止。
(基本上我应该得到相同的输出来打印数据和问题)。
答案 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
会将标记化的字符串指针移过已停用的令牌以进行下一次迭代通过循环。
另见: