剪切某个字符的字符串

时间:2017-11-05 19:24:41

标签: c

我试图制作一个剪切和打印/用字符串部分做某事的功能。

说我有这个字符串:

"strings.no.header"

我想把它分开,所以打印出这样的东西:

strings
no
header

这是我糟糕的尝试,我首先能够(没有else语句)打印出“字符串”。我的想法是使函数递归,因此它打印并删除“。”之前的第一部分,然后对字符串的其余部分执行相同的操作。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void cut(char string[]);

int main() {
  char string[] = "strings.no.header";
  cut(string);
}

void cut(char string[]) {
  char *toString = malloc(sizeof(char));
  int len = strlen(string);

  for(int i = 0; i < len; i++) {
    int count = 0;
    if(string[i] != '.') {
      toString[i] = string[i];
    } else if(string[i] == '.') {
      char *tmp = malloc(sizeof(char));
      tmp = string + i;
      cut(tmp);
    }
  }
  printf("%s", toString);
}

如果有人能指出我正确的方向,我将不胜感激。

4 个答案:

答案 0 :(得分:1)

我有个主意:

查看此网页:https://en.wikibooks.org/wiki/C_Programming/Strings

使用strchr查找&#39;然后,一旦你知道了这个位置,就用其他字符串复制字符,记住你已经知道&#39;。&#39;出现,所以你确切地知道要复制什么。

答案 1 :(得分:1)

Strtok是你的朋友。无需重新发明轮子。

void cut (const char* str){
  char * pch;
  pch = strtok (str,".");
  while (pch != NULL)
  {
    printf ("%s\n",pch);
    pch = strtok (NULL, ".");
  }
}

代码只是从链接中快速编辑样本。

答案 2 :(得分:1)

strtok的解决方案:

#include <stdio.h>
#include <string.h>

void cut(char string[]);

int main()
{

  char string[] = "strings.no.header";
  cut(string);

}


void cut(char string[])
{
    char *pch;
    pch = strtok (string, ".");
    while (pch != NULL)
    {
        printf ("%s\n",pch);
        pch = strtok (NULL, ".");
    }

}

答案 3 :(得分:1)

正如其他人所说,对于类似的事情,strtok将为您提供所需的信息。一句警告,此功能将破坏您的字符串,因此始终建议先制作副本。

基本上,strtok所做的是替换字符串中与strtok的第二个参数匹配的所有字符,并将其替换为'\0'字符。然后该函数返回指向第一个“标记”的指针。对strtok的每次后续调用都将返回指向下一个标记的指针。 Here是一个基础教程。

为了简单起见,我将所有代码保存在main中。您现在可以使用此技术来实现适合您特定问题的逻辑。

int main()
{
    char string[] = "strings.no.header";
    char buffer[50] = { 0 };//make sure big enough
    char* token = NULL;
    char* nextToken = NULL;

    //want to make a copy because strtok will wreck the string
    strcpy(buffer, string);

    token = strtok_s(buffer, ".", &nextToken);
    while (token)
    {
        printf("%s\n", token);//or do whatever you like.
        token = strtok_s(NULL, ".", &nextToken);//pass NULL on subsequent calls
    }
    getchar();
    return 0;
} 

你可能会觉得这很有意思:
第一次致电token = strtok_s(buffer, ".", &nextToken);后, buffer现在包含:"strings\0no.header"

第二次通话后, buffer现在包含:"strings\0no\0header"

这就是为什么要在使用strtok之前复制原始字符串的原因。如果您不关心原始string,则可以使用它。