【发布时间】:2017-01-13 09:23:57
【问题描述】:
我需要将一个句子,例如“Hello world”复制到一个字符串列表中,意思是复制到一个字符数组中,其中每两个单词由'\0' 分隔。
请注意,单词被定义为一行中不带空格的任意数量的字符。
因此,每当我的程序在一行中检测到任意数量的空格(仅包括 1 个空格)时,它都应该使用单个 '\0'。
问题是在我的target char 数组中第一次写入'\0' 之后,我不能再写入它了。我猜是因为'\0' 表示字符串结尾,但在我的情况下,我试图在 char 数组中实现一个字符串列表,所以我必须在每 2 个单词之间有 '\0'。
基本上我的问题是在输入'\0' 之后如何计数写入字符数组?
到目前为止,这是我的代码(如您所见,我还在每次迭代时检查 traget 中是否有足够的空间,但该部分工作正常,因此并不是很有趣)
int strListFromWords(const char* source, char* target, int buffSize)
{
if (buffSize < 2) return -1;
char* sCurrentPointer = source;
char* tCurrentPointer = target;
int charsInTarget = 0;
while (*sCurrentPointer != '\0') // While not end of string
{
if (charsInTarget + 2 < buffSize) // if there is enough space in target for current char
{
charsInTarget++;
if (!isspace(*sCurrentPointer)) // if current char isn't space
{
*tCurrentPointer = *sCurrentPointer;
sCurrentPointer++;
tCurrentPointer++;
}
else
{
*tCurrentPointer = '\0'; // PROBLEMATIC LINE put '\0' instead of spcace (in target)
sCurrentPointer++; // goto next char in source
tCurrentPointer++; // goto next position in target
while (isspace(*sCurrentPointer)) // while there are more spaces in a row
{
sCurrentPointer++; // just skip them without messing with target
}
}
}
else
{ // Not enough space
emptyStrList(target);
return 0;
}
}
*tCurrentPointer = '\0';
*(tCurrentPointer + 1) = '\0';
return numStrsInList(target);
}
谢谢,
【问题讨论】:
-
strtok()按照您的描述进行。你只需要“重新发明轮子”来学习。 -
@pmg 这正是我的目的
-
在深入研究如何执行此操作之前,不妨问问自己这个问题:您将如何检索从单独组成的“字符串列表”中的每个“单词”目标
char缓冲区?使用嵌入的 nullchar 策略是可行的,最后以两个 nullchars 结束,但你(这个东西的调用者)最好明白这是计划。传统上,pointers 数组用于构建字符串列表;不是单个字符缓冲区。