在 C 中复制 Strlen 函数
Replicating the Strlen function in C
我一直在做我的 C 作业,我尝试在不实际使用它的情况下复制 strlen() 函数。这是我一直试图开始工作的代码。然而,不知何故 main 函数并没有反映 mystrlen() 函数中发生的事情。你能告诉我为什么它不能像 strlen() 函数那样工作吗?
#include <stdio.h>
int mystrlen(char *input_string) {
/* This function returns the length of the input string */
/* WRITE FUNCTION CODE HERE! */
char str1[50];
int abcd = 0;
scanf("%s", str1);
int m;
for(m=0; str1[m]; m++){
abcd ++;
}
return 0;
}
int main(int argc, char **argv) {
int length;
if (argc!=2) {
printf("Usage: strlen <input_string_with_no_space_inside_it>\n\n");
return 1;
}
length = mystrlen(argv[1]);
printf("The length is: %d characters.\n",length);
return 0;
}
这个:
return 0;
应该是:
return abcd;
就是说,abcd
是这个变量的糟糕名称,而且该函数作为 strlen()
替换没有什么意义。它没有触及它的参数,并调用 scanf()
来读取用户的输入,你真的不希望 strlen()
替换来做。
这是一种写法:
size_t mystrlen(const char *s)
{
size_t len = 0;
if(s != NULL)
{
while(*s != '[=12=]')
{
++len;
++s;
}
}
return len;
}
改进包括:
- 正确的
size_t
类型的 return 值(长度是大小,不能为负数)所以 size_t
是正确的,真正的 strlen()
使用什么。
- 不进行任何输入读取。
- 使用输入参数。
- 计算长度并return计算长度。
它也处理被给予 NULL
作为奖励。
一个匹配的 main()
可以做你所做的事情:
int main(int argc, char **argv)
{
if (argc != 2)
{
printf("Usage: strlen <input_string_with_no_space_inside_it>\n\n");
return 1;
}
const size_t length = mystrlen(argv[1]);
printf("The length is: %zu characters.\n", length);
return 0;
}
这基本上围绕着 int
到 size_t
的变化。另请注意,在支持引用的 shell 中,您可以像这样 运行 您的程序:
$ ./strlen "hello this is a string with spaces in it"
并且它将在 argv[1]
.
中传递整个带引号的字符串(当然没有引号)
首先,你尝试传递一个字符串,然后调用mystrlen中的scanf函数。删除这个scanf。
其次,你的函数总是 returns 零而不是变量 abcd 的值。
我一直在做我的 C 作业,我尝试在不实际使用它的情况下复制 strlen() 函数。这是我一直试图开始工作的代码。然而,不知何故 main 函数并没有反映 mystrlen() 函数中发生的事情。你能告诉我为什么它不能像 strlen() 函数那样工作吗?
#include <stdio.h>
int mystrlen(char *input_string) {
/* This function returns the length of the input string */
/* WRITE FUNCTION CODE HERE! */
char str1[50];
int abcd = 0;
scanf("%s", str1);
int m;
for(m=0; str1[m]; m++){
abcd ++;
}
return 0;
}
int main(int argc, char **argv) {
int length;
if (argc!=2) {
printf("Usage: strlen <input_string_with_no_space_inside_it>\n\n");
return 1;
}
length = mystrlen(argv[1]);
printf("The length is: %d characters.\n",length);
return 0;
}
这个:
return 0;
应该是:
return abcd;
就是说,abcd
是这个变量的糟糕名称,而且该函数作为 strlen()
替换没有什么意义。它没有触及它的参数,并调用 scanf()
来读取用户的输入,你真的不希望 strlen()
替换来做。
这是一种写法:
size_t mystrlen(const char *s)
{
size_t len = 0;
if(s != NULL)
{
while(*s != '[=12=]')
{
++len;
++s;
}
}
return len;
}
改进包括:
- 正确的
size_t
类型的 return 值(长度是大小,不能为负数)所以size_t
是正确的,真正的strlen()
使用什么。 - 不进行任何输入读取。
- 使用输入参数。
- 计算长度并return计算长度。
它也处理被给予 NULL
作为奖励。
一个匹配的 main()
可以做你所做的事情:
int main(int argc, char **argv)
{
if (argc != 2)
{
printf("Usage: strlen <input_string_with_no_space_inside_it>\n\n");
return 1;
}
const size_t length = mystrlen(argv[1]);
printf("The length is: %zu characters.\n", length);
return 0;
}
这基本上围绕着 int
到 size_t
的变化。另请注意,在支持引用的 shell 中,您可以像这样 运行 您的程序:
$ ./strlen "hello this is a string with spaces in it"
并且它将在 argv[1]
.
首先,你尝试传递一个字符串,然后调用mystrlen中的scanf函数。删除这个scanf。 其次,你的函数总是 returns 零而不是变量 abcd 的值。