【问题标题】:Reversing a string in c, problem using strlen function在c中反转字符串,使用strlen函数的问题
【发布时间】:2020-07-14 17:14:24
【问题描述】:

我写了一个代码来反转一个字符串,但是strlen 函数给了我错误的字符串长度,这就是为什么字符串的反转没有正确完成。这是我写的代码:

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

void reversestring(char string[], int start, int end);

int main() {
    char str[500];
    int n;
    n = strlen(str);
    reversestring(str, 0, n - 1);
    printf("%d\n", n);
    printf("The reverse string is %s", str);
    return 0;
}

void reversestring(char string[], int start, int end) {
    printf("enter the string:\n");
    scanf("%s", string);
    int temp;
    while (start < end) {
        //printf("insidewhile\n");
        temp = string[start];
        string[start] = string[end];
        string[end] = temp;
        start++;
        end --;
    }
}

【问题讨论】:

  • 小测验:str的内容是什么?主函数中的那个,而不是反向函数中的 string
  • 任何时候你发现自己想说一个基本且广泛使用的软件,比如strlen函数,给出了错误的结果,你需要停下来告诉自己:“有些东西继续我不明白。问题出在我写的软件上。我最好弄清楚它是什么”。根据需要重复(和调试)。

标签: c reverse c-strings function-definition


【解决方案1】:

strlen() 不能给你一个字符串的长度,当它的参数不指向一个有效的字符串时,你的例子就是这种情况:

char str[500];
int n;
n = strlen(str);

str 没有用字符串初始化。

提供指向不包含字符串作为strlen() 参数的char 数组的指针会导致未定义的行为。

同样strlen() 不返回int。它的返回值是size_t 类型。

在输入字符串时也使用fgets() 而不是scanf()。它更安全一点。


解决方案:

main()中的字符串输入str,然后使用strlen(),然后调用reversestring()函数:

char str[500];         
size_t n;

printf("enter the string:\n");
fgets(str,500,stdin);

n = strlen(str);   
reversestring(str, 0, n-1);

我还相应地编辑了函数声明和 printf() 以处理 size_t 类型。


这里是完整代码 (Online Example):

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

void reversestring(char string[], size_t start, size_t end);

int main()
{
    char str[500];
    size_t n;

    printf("enter the string:\n");
    fgets(str,500,stdin);
    str[strcspn(str, "\n")] = 0;    // removing trailing newline from fgets

    n = strlen(str);   
    reversestring(str, 0, n-1);

    printf("%zu\n", n);
    printf("The reverse string is %s", str);
    return 0;
}


void reversestring(char string[], size_t start, size_t end)
{
    int temp;
    while(start < end)
    {   //printf("insidewhile\n");
        temp = string[start];
        string[start] = string[end];
        string[end] = temp;
        start++;
        end --;
    }
}

输出:

enter the string:             
helloworld     
10                     
The reverse string is dlrowolleh

【讨论】:

    【解决方案2】:

    您应该在str 初始化之后使用strlen 并设置reversestring 的第三个参数的正确大小:

    size_t max_length = 128;
    
    reversestring(str, 0, max_length);
    n = strlen(str);
    

    【讨论】:

      【解决方案3】:

      声明的字符数组中没有字符串

      {   char str[500];
          int n;
      

      字符数组未初始化。所以这个电话

      n = strlen(str);
      

      导致未定义的行为。

      这段代码sn-p来自函数reversestring

      printf("enter the string:\n");
      scanf("%s", string);
      

      应该在函数之外,在函数被调用之前使用。

      函数的声明至少应该是这样的

      char * reversestring( char string[], size_t n );
      

      不需要像你那样用三个参数声明函数

      void reversestring(char string[], int start, int end);
      

      因为对这个函数的调用可以代替前面显示的函数的调用,比如

      reversestring( string + start, end - start + 1 );
      

      还要注意使用%s的格式是不允许输入句子的。此外,将这个格式说明符与函数scanf一起使用是不安全的,而函数strlen的返回类型为size_t

      这是函数定义

      char * reversestring( char s[], size_t n )
      {
          for ( size_t i = 0; i < n / 2; i++ )
          {
              char c = s[i];
              s[i] = s[n-i -1];
              s[n-i-1] = c;
          }
      
          return s;
      }
      

      这是一个演示程序。

      #include <stdio.h>
      #include <string.h>
      
      char * reversestring( char s[], size_t n )
      {
          for ( size_t i = 0; i < n / 2; i++ )
          {
              char c = s[i];
              s[i] = s[n-i -1];
              s[n-i-1] = c;
          }
      
          return s;
      }
      
      int main(void) 
      {
          enum  { N = 500 };
          char s[N];
      
          printf( "Enter a string: " );
      
          fgets( s, N, stdin );
      
          s[ strcspn( s, "\n" ) ] = '\0';
      
          size_t n = strlen( s );
      
          puts( reversestring( s, n ) );
      
          char *p = strchr( s, ' ' );
      
          if ( p != NULL && ( p = strchr( p + 1, ' ' ) ) != NULL )
          {
              reversestring( s, p - s );
              puts( s );
          }
      
          return 0;
      }
      

      它的输出可能看起来像

      Enter a string: Hello Shivam Gupta
      atpuG mavihS olleH
      Shivam Gupta olleH
      

      【讨论】:

        猜你喜欢
        • 2014-03-30
        • 2013-03-20
        • 1970-01-01
        • 2022-01-09
        • 2020-02-20
        • 1970-01-01
        • 2020-09-20
        • 2013-04-30
        • 2013-05-12
        相关资源
        最近更新 更多