我试图制作一个剪切和打印/用字符串部分做某事的功能。
说我有这个字符串:
"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);
}
如果有人能指出我正确的方向,我将不胜感激。
答案 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
,则可以使用它。