将空格中的getline输入分解为一个字符指针数组

时间:2014-05-10 22:17:31

标签: c

我正在尝试从getline给出的输入中包含空格并将每个单词放入一个字符指针数组中。我真的不确定如何解决这个问题。我知道有strtok,但这只是取出空间并将其变成一个巨大的单词以供我理解。一些见解会非常有帮助。

2 个答案:

答案 0 :(得分:1)

这不会给你提供代码,但问题可能会引导你。

您必须知道答案的问题:

  1. 您是否需要一次只处理一行中的单词,还是需要将已读取的所有单词保留在内存中?
  2. 如果同一个单词出现多次,您是否需要将单独的外观分开?
  3. 一条线的长度,一个字的长度或一行中的字数是否有任何合理的上限?如果你保留所有的话,那么所有的信息都会记忆在内存中吗?
  4. 假设您正在使用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"
...