不使用字符串库的c中的字符串长度
string length in c without using string library
char* str =
"\
a-a-a-a\
differing the text, because that was the lecture thing\
the text has been changed\
I know!\
the text has been changed\
";
我对此深思了几个小时,但还是想不通..
仅使用 stdio.h
string.h 是不允许的,但只使用基本的东西..
如何获取字符串长度?有人请帮助我。
目标是找到给定字符串中输入模式的频率
ex) ha => 2, di => 1..
帮助我。
关于字符串的长度,strlen
的实现不是很复杂。
您应该做的就是循环遍历字符串,直到找到 [=13=]
(字符串结尾)并计算循环次数。
unsigned int mystrlen(const char* str)
{
unsigned int length = 0;
while (*str != 0)
{
str++;
length++;
}
return length;
}
这可以缩短为
unsigned int len = 0;
for (; str[len]; len++);
纯C 中的字符串只是指向内存的指针。
如果最后一个元素是 0,那么你可以使用 strlen 或任何检查。
但如果不是这种情况,您需要记住变量中的长度。
因此,如果它以 0 结尾,则只需循环到第一个为 0(不是“0”)的元素,这就是结尾。如果你计算你有字符串长度的元素。
这适用于一些测试输入字符串,但我强烈建议在更多情况下检查它。
假设我们已经实现了strstr()
。
strstr()
是来自string.h
库
的C库函数
char *strstr(const char *haystack, const char *needle)
此函数查找子字符串 needle
在源字符串 haystack
中的第一次出现。
不比较终止 [=18=]
个字符。
source: TutorialsPoint
(有一些版本)
代码
#include <stdio.h>
#include <string.h>
unsigned int Neostrlen(const char* str)
{
unsigned int length = 0;
while (*str != 0)
{
str++;
length++;
}
return length;
}
int BluePIXYstrlen(char* str)
{
int len = 0;
sscanf(str, "%*[^0]%n", &len);
return len;
}
int Jeanfransvastrlen(char* str)
{
int i;
for (i=0;str[i];i++);
return i;
}
int main(int argc, char **argv){
//is it true, no need to malloc????
char* str =
"\
P-P-A-P\
I have a pen, I have a apple\
Uh! Apple-Pen!\
I have a pen, I have pineapple\
Uh! Pineapple-Pen!\
Apple-Pen, Pineapple-Pen\
Uh! Pen-Pineapple-Apple-Pen\
Pen-Pineapple-Apple-Pen\
";
printf("len: %d\n", Jeanfransvastrlen(str));
printf("len: %d\n", Neostrlen(str));
printf("len: %d\n", BluePIXYstrlen(str));
printf("sss:%s\n\n\n", str);
char * search = "have";//search for this substring
int lenSr= Neostrlen(search);
printf("lenSr: %d\n", lenSr);
char * ret;
ret = strstr(str, search);
int count = 0;
while (ret){
//printf("The substring is: %s\n\n\n\n", ret);
count++;
for (int i=0;i<lenSr;i++){
printf("%c", ret[i]);
}
printf("\nEnd sub\n");
for (int i=0;i<lenSr;i++){
ret++;
}
ret = strstr(ret, search);
}
printf("count: %d\n", count);
return 0;
}
已编辑
如果仅使用 stdio.h
,您可以将所有 strstr()
替换为从 leetcode
采纳的 mystrstr()
版本
mystrstr()
char* mystrstr(char *str, const char *target) {
if (!*target) {
return str;
}
char *p1 = (char*)str;
while (*p1) {
char *p1Begin = p1, *p2 = (char*)target;
while (*p1 && *p2 && *p1 == *p2) {
p1++;
p2++;
}
if (!*p2){
return p1Begin;
}
p1 = p1Begin + 1;
}
return NULL;
}
提示
我从 mystrstr()
的第一个第一个参数中删除了 const
因为我想稍后更改它,这是我对原始代码所做的唯一更改。
此版本对字符串中的大小写字母敏感,
例如 Apple
不同于 apple
.
正如 chux 在评论中所说,我的代码 return "ababa"
的子字符串来自源代码
"aba"
只有 {aba}
没有更多。这是因为我在最后 for
中更改了 while
内的字符串指针。
建议
尝试实施您的 strstr()
和 strlen()
版本
char* str =
"\
a-a-a-a\
differing the text, because that was the lecture thing\
the text has been changed\
I know!\
the text has been changed\
";
我对此深思了几个小时,但还是想不通.. 仅使用 stdio.h
string.h 是不允许的,但只使用基本的东西..
如何获取字符串长度?有人请帮助我。
目标是找到给定字符串中输入模式的频率
ex) ha => 2, di => 1..
帮助我。
关于字符串的长度,strlen
的实现不是很复杂。
您应该做的就是循环遍历字符串,直到找到 [=13=]
(字符串结尾)并计算循环次数。
unsigned int mystrlen(const char* str)
{
unsigned int length = 0;
while (*str != 0)
{
str++;
length++;
}
return length;
}
这可以缩短为
unsigned int len = 0;
for (; str[len]; len++);
纯C 中的字符串只是指向内存的指针。 如果最后一个元素是 0,那么你可以使用 strlen 或任何检查。 但如果不是这种情况,您需要记住变量中的长度。
因此,如果它以 0 结尾,则只需循环到第一个为 0(不是“0”)的元素,这就是结尾。如果你计算你有字符串长度的元素。
这适用于一些测试输入字符串,但我强烈建议在更多情况下检查它。
假设我们已经实现了strstr()
。
strstr()
是来自string.h
库
char *strstr(const char *haystack, const char *needle)
此函数查找子字符串 needle
在源字符串 haystack
中的第一次出现。
不比较终止 [=18=]
个字符。
source: TutorialsPoint (有一些版本)
代码
#include <stdio.h>
#include <string.h>
unsigned int Neostrlen(const char* str)
{
unsigned int length = 0;
while (*str != 0)
{
str++;
length++;
}
return length;
}
int BluePIXYstrlen(char* str)
{
int len = 0;
sscanf(str, "%*[^0]%n", &len);
return len;
}
int Jeanfransvastrlen(char* str)
{
int i;
for (i=0;str[i];i++);
return i;
}
int main(int argc, char **argv){
//is it true, no need to malloc????
char* str =
"\
P-P-A-P\
I have a pen, I have a apple\
Uh! Apple-Pen!\
I have a pen, I have pineapple\
Uh! Pineapple-Pen!\
Apple-Pen, Pineapple-Pen\
Uh! Pen-Pineapple-Apple-Pen\
Pen-Pineapple-Apple-Pen\
";
printf("len: %d\n", Jeanfransvastrlen(str));
printf("len: %d\n", Neostrlen(str));
printf("len: %d\n", BluePIXYstrlen(str));
printf("sss:%s\n\n\n", str);
char * search = "have";//search for this substring
int lenSr= Neostrlen(search);
printf("lenSr: %d\n", lenSr);
char * ret;
ret = strstr(str, search);
int count = 0;
while (ret){
//printf("The substring is: %s\n\n\n\n", ret);
count++;
for (int i=0;i<lenSr;i++){
printf("%c", ret[i]);
}
printf("\nEnd sub\n");
for (int i=0;i<lenSr;i++){
ret++;
}
ret = strstr(ret, search);
}
printf("count: %d\n", count);
return 0;
}
已编辑
如果仅使用 stdio.h
,您可以将所有 strstr()
替换为从 leetcode
mystrstr()
版本
mystrstr()
char* mystrstr(char *str, const char *target) {
if (!*target) {
return str;
}
char *p1 = (char*)str;
while (*p1) {
char *p1Begin = p1, *p2 = (char*)target;
while (*p1 && *p2 && *p1 == *p2) {
p1++;
p2++;
}
if (!*p2){
return p1Begin;
}
p1 = p1Begin + 1;
}
return NULL;
}
提示
我从
mystrstr()
的第一个第一个参数中删除了const
因为我想稍后更改它,这是我对原始代码所做的唯一更改。此版本对字符串中的大小写字母敏感, 例如
Apple
不同于apple
.正如 chux 在评论中所说,我的代码 return
"ababa"
的子字符串来自源代码"aba"
只有{aba}
没有更多。这是因为我在最后for
中更改了while
内的字符串指针。
建议
尝试实施您的 strstr()
和 strlen()