0

我写了一个代码来反转一个字符串,但是这个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 --;
    }
}
4

3 回答 3

1

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

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

str不是用字符串初始化的。

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

也不strlen()返回int. 它的返回值是 type 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类型。


这是完整的代码(在线示例):

#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
于 2020-04-02T16:48:16.960 回答
0

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

size_t max_length = 128;

reversestring(str, 0, max_length);
n = strlen(str);
于 2020-04-02T16:40:01.200 回答
0

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

{   char str[500];
    int n;

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

n = strlen(str);

导致未定义的行为。

此代码片段来自函数 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
于 2020-04-02T16:51:47.947 回答