我正在尝试从getline
给出的输入中包含空格并将每个单词放入一个字符指针数组中。我真的不确定如何解决这个问题。我知道有strtok
,但这只是取出空间并将其变成一个巨大的单词以供我理解。一些见解会非常有帮助。
答案 0 :(得分:1)
这不会给你提供代码,但问题可能会引导你。
您必须知道答案的问题:
假设您正在使用POSIX getline()
,那么您可以使用它来为单词分配存储空间。您必须决定如何管理指针数组的存储。固定大小的分配是最简单的,但动态分配的数组并不是很难。如果你一次处理一行,那么生活很容易。如果你在不同的行中累积数据,那么你必须确保getline()
为每一行分配新的空间 - 并不难,但需要谨慎。无论哪种方式,您都需要小心释放getline()
分配的空间。
您可以使用strtok()
,但如果strtok_r()
或strtok_s()
可用,则应使用其中之一。 (它们实际上是可以互换的,尽管它们的错误行为是不同的。请注意,C11附件K中定义的strtok_s()
与其他的不同。)
另一种选择是使用strdup()
复制解析后的单词,也可以使用strchr()
找到标记单词结尾的空格。然后,您将使用getline()
重复使用相同的存储空间,因为您已经拥有了这些字词的副本。
答案 1 :(得分:0)
所以,你需要设置一个像这样的char指针数组:
char *srcStr = "Now is the time for all good men";
^ ^ ^ ^ ^ ^ ^ ^
p0 p1 p2 p3 p4 p5 p6 p7
执行此操作的常用方法是在字符串中搜索空格。
char *srcStr = "Now is the time for all good men";
^ ^ ^ ^ ^ ^ ^
注意每个空格只是一个与指针设置位置相关的字符。
请考虑以下代码:
...
char *ptrArray[10];
int ptrIndex = 0;
char *cp = srcStr;
// ptrArray[0] points to "Now...", and increment the ptrIndex.
ptrArray[ptrIndex++] = cp;
// Find the next space character.
while((cp=strchr(cp, ' '))
// If another space is found, assign the next pointer in
// 'ptrArray' to the address of 'cp' plus one.
ptrArray[ptrIndex++] = ++cp;
...
此代码是问题的原始答案。但是,它可能无法产生预期的结果。具体来说,如果您要打印指针值:
printf("p0[%s]\n", ptrArray[0]); //Output: "Now is the time for all good men"
printf("p1[%s]\n", ptrArray[1]); //Output: "is the time for all good men"
printf("p2[%s]\n", ptrArray[2]); //Output: "the time for all good men"
一个如此 如果打算将输出(上面)限制为每个指针只有一个单词,而不是:
while((cp=strchr(cp, ' '))
ptrArray[ptrIndex++] = ++cp;
代码可以这样做:
while((cp=strchr(cp, ' '))
{
*cp='\0';
ptrArray[ptrIndex++] = ++cp;
}
这将在srcStr中交换'\ 0',其中找到空格''。像这样:
char *srcStr = "Nowɸisɸtheɸtimeɸforɸallɸgoodɸmen";
^ ^ ^ ^ ^ ^ ^ ^
p0 p1 p2 p3 p4 p5 p6 p7
因此,在每个单词后面放置一个字符串终止字符'\ 0',结果为:
printf("p0[%s]\n", ptrArray[0]); //Output: "Now"
printf("p1[%s]\n", ptrArray[1]); //Output: "is"
printf("p2[%s]\n", ptrArray[2]); //Output: "the"
...