我一直在做我的 C 作业,我尝试复制 strlen() 函数而不实际使用它。这是我一直在努力工作的代码。然而,不知何故, main 函数并没有反射(reflect) 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 != '\0')
{
++len;
++s;
}
}
return len;
}
改进包括:
- 正确的
size_t
类型的返回值(长度是大小,不能为负),因此size_t
是正确的,并且是真正的strlen()
用途。 - 不执行任何输入读取。
- 使用输入参数。
- 计算长度并返回它。
作为奖励,它还可以处理给予 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]
中传递整个带引号的字符串(当然没有引号)。
关于c - 在 C 中复制 Strlen 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46093159/