【问题标题】:Finding string length without using library function在不使用库函数的情况下查找字符串长度
【发布时间】:2020-02-05 12:03:24
【问题描述】:

我正在编写一个函数来查找字符串长度而不使用标准标题。我从头到尾完成了代码,但是当我最后返回计数时,它没有返回(第 1 点)正确答案。

例如:

Enter name:
ISRO
Name is ISRO
Length is 4
&
Process returned 17

代码:

int stringlength (char[]);

void main()
{
    char str[20];
    int len;
    printf("Enter name:\n");
    gets(str);
    printf("Your name is %s\n",str);
    len = stringlength(str);
    printf("Name length is %d\n", len);

}

int stringlength (char x[])
{
    int i=0,count=0;

    while(x[i] != '\0')
    {
        count++;
        i++;
    }
    return count; (Point 1)
}

【问题讨论】:

  • (Point 1)”是什么意思?此外,还请澄清您的输出(您给出的输出是预期的输出?)。
  • icountstringlength 函数中具有相同的值。你可以放弃其中之一。此外,输出看起来正确
  • 很可能不是void main(),而是int main()
  • 你使用一些 IDE 吗?或者你用什么编译器?尝试使其成为int main() 并在主要功能的末尾return 0;
  • 嗨,您的示例输出实际上与您的代码不匹配。例如,输出显示“Name is”,但代码打印“Your name is”。我不是要小气。包含您遇到困难的代码的确切版本非常重要。

标签: c arrays string string-length


【解决方案1】:

您可能会因为“进程返回 17”这一行而感到困惑。通常像 IDE 打印的那样行。这是因为main 必须返回退出代码。将main函数声明为int main(),最后加上return 0;

实际上它返回最后一个函数的结果。在您的情况下,它是 printf 返回打印字符数。

【讨论】:

  • @P.Dmitry 您应该提到它是由任何框架/IDE 等 OP 打印的,并且它不是程序输出的一部分。
  • @Jabberwocky - 事实上,Visual Studio 没有问题 - 进程以 0 退出。但是,对于像 void main() 这样的声明,返回值为 UB - 请参阅:en.cppreference.com/w/c/language/main_function(接近结尾页面)。
【解决方案2】:

对于初学者来说,函数 gets 不是标准 C 函数,因此 C 标准不再支持它。改用标准函数fgets

例如

printf( "Enter name: " );
fgets( str, sizeof( str ), stdin );
str[ strcspn( str, "\n" ) ] = '\0';

根据 C 标准,不带参数的函数 main 也应声明为

int main( void )

对于查找字符串长度的函数,那么它应该以如下方式声明

size_t stringlength( const char s[] );

并且可以像这样更简单地实现

size_t stringlength( const char s[] )
{
    size_t n = 0;

    while( *s++ != '\0' ) ++n;

    return n;
}

在 main 你可以写

size_t len = stringlength(str);
printf("Name length is %zu\n", len);
                       ^^^

这是一个演示程序

#include <stdio.h>
#include <string.h>

size_t stringlength( const char s[] )
{
    size_t n = 0;

    while( *s++ != '\0' ) ++n;

    return n;
}

int main(void) 
{
    enum { N = 20 };
    char str[N];

    printf( "Enter name: " );

    fgets( str, sizeof( str ), stdin );
    str[ strcspn( str, "\n" ) ] = '\0';

    printf( "Your name is %s\n", str );

    size_t len = stringlength( str );
    printf( "Name length is %zu\n", len );  

    return 0;
}

它的输出可能看起来像

Enter name: Gokul UK
Your name is Gokul UK
Name length is 8

【讨论】:

  • @Adrian 早上好。没问题。
【解决方案3】:

问题是函数gets() 已从C 标准中删除,不应使用(但是,许多编译器和平台仍然实现它)。因此,我不确定您的实现如何处理它。在 Visual Studio 2019 中,我运行您的程序并且它可以工作! (MSVC 在运行时库中有gets,但在标头中没有,因此它认为它是“未知返回 int”,这将允许它使用二进制 RTL 中的代码。)

但是,如果我将gets(str); 更改为标准fgets(str, 20, stdin);,那么我得到的长度比我(或你)预期的要长。 (这是你看到的吗?)

'extra' 字符的原因是fgets 函数返回一个包含终止换行符的字符串。

【讨论】:

  • 嗨,确切地说,gets() 自 C11 起已被明确删除(不仅仅是弃用)。它在 C++ 中已弃用。我相信这是第一个也是唯一一个被删除的功能。我找不到引用,但标准委员会的观点是,这是一个漏洞,任何使用它的代码都应该被视为已经损坏!
  • @Adrian 我不知道谁对你的回答投了反对票。至于我,我投了赞成票。:)
  • @Persixty - 你是对的!我已经相应地编辑了我的答案 - 希望你批准。
  • @Adrian 我愿意。我只是认为值得强调gets() 的糟糕程度。最糟糕的。图书馆。功能。永远!
  • @Adrian 这里的问题可能是main 的签名不正确,应该是int main()
【解决方案4】:

请在不使用内置函数的情况下找到查找字符串长度的代码。我们可以编写一个函数,而不会使它变得非常复杂。作为一个基础学习者,我可能会犯这些错误。谢谢大家花时间解决我的疑问。快乐学习。

      #include <stdio.h>

       void main()
  {
       char string[50];
       int i, length = 0;

      printf("Enter a string \n");
      gets(string);

     for (i = 0; string[i] != '\0'; i++)
    {
          length++;
     }

       printf("The length of %s = %d\n", string, length);
      }

【讨论】:

    猜你喜欢
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多