如何解决找到特定字符后剪切字符串
我正在制作一个函数,当它找到某个字符时会“切割”一个字符串,但是我遇到了一些错误,而我却找不到失败的原因。代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int cut(char *src,char sep){
int i = 0;
while(++i < strlen(src) && *src && *src != sep)
src++;
*src = '\0';
return i;
}
int main(void){
char *line = (char *) malloc(32 * sizeof(char));
strcpy(line,"#defineABC12");
printf("%s\n",line);
cut(line,'1');
printf("%s\n",line);
return 0;
}
如果我的逻辑没有失败,那么预期的输出应该是这样的:
#defineABC12
#defineABC
但是我得到了这个:
#defineABC12
#defin
除了在x86_64机器上使用GCC,我不知道这是否会改变
解决方法
您的循环表达式有问题。
while(++i < strlen(src) && *src && *src != sep)
src++;
您可以在每次循环迭代中测量字符串的长度,但是它会开始从src
指针开始获取字符串长度。每次循环迭代都增加指针,因此字符串长度随每次迭代而变化。下表说明了您要测量的内容。
i src len
= ============ ===
0 #defineABC12 12
1 defineABC12 11
2 efineABC12 10
...
因此,循环会在您期望之前退出。
通常,您不需要此“ i”业务。 'c'中的每个字符串均以空字符结尾,因此'* str'在您的情况下就足够了,以下内容应该可以正常工作:
while(*src && *src != sep)
src++;
在其他情况下,如果您需要字符串长度,则应在循环之前获取它,例如
int len = strlen(src);
int i = 0;
while(i <= len && src[i] != sep)
i++;
src[i-1] = 0;
,
简化事情的另一种方法是在循环中增加事情时限制数目。您要递增i
,就不需要也要递增指针src
,只需使用索引符号即可,例如src[i]
处理字符串。这将使您可以将cut()
函数简化为:
int cut (char *src,char sep)
{
int i = 0;
for (; src[i] && src[i] != sep; i++) {}
src[i] = '\0';
return i;
}
使用/输出示例
在这种情况下,您的结果是:
$ ./bin/cutstr
#defineABC12
#defineABC
如果您可以简化活动部件的数量,则可以帮助您保持逻辑顺畅。
您也可以在没有索引的情况下简单地增加指针,例如
int cut (char *src,char sep)
{
char *p = src;
for (; *p && *p != sep; p++) {}
*p = '\0';
return p - src;
}
(相同的结果,都返回10
)
或者,由于您加入了string.h
,因此strchr()
可以完成工作,例如
int cut (char *src,char sep)
{
char *p = strchr (src,sep);
if (p) {
*p = 0;
return p - src;
}
return strlen(src);
}
(结果相同)
如果您有任何疑问,请告诉我。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。