使用在 C 中的 for 循环中无法正常工作的变量定义字符串的大小

Defining size for string using a variable not working properly in for loop in C

我试图反转用户输入的字符串,这里的问题出在函数*rev,当我使用size = strlen(STR);获取字符串的长度并将其传递给revS[size] 的大小程序输出一些反向字符串的垃圾值!如果我在 revS[10] 和 运行 程序中传递一些值而不是 size 它按预期工作。我已经将 size 的值检查为

printf("\nlength of string is: %d\n",size);

它给出了正确的值。我不知道哪里出了问题!

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

char *rev(char *);

int main()
{
    char string[100];
    printf("Enter the string to reverse: ");
    scanf("%s", string);
    printf("You entered string : %s\n Reversed string is: %s", string, rev(string));
}


char *rev(char *STR)
{
    int size, i, j = 0;
    size = strlen(STR);
    printf("\nlength of string is: %d\n", size);
    char revS[size];

    for(i = size-1; i >= 0; i--)
    {
        revS[j] = STR[i];
        j = j + 1;
    }

    revS[j] = '[=11=]';
    return (revS);  
}

输出:

Enter the string to reverse: mahaveer

length of string is: 8
You entered string : mahaveer
 Reversed string is: ╚²b
--------------------------------
Process exited after 28.7 seconds with return value 0
Press any key to continue . . .

问题是你的反转字符串分配在栈上而不是堆上。当您的 rev 函数 returns 时,该范围内的所有变量都将被垃圾回收。您可以使用 malloc() 在堆上动态分配内存。请注意,调用者负责在字符串上调用 free() 以避免内存泄漏。

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

char *rev(char *);

int main() {
    char string[100];
    printf("Enter the string to reverse: ");
    scanf("%s", string);
    char *r = rev(string);
    printf("You entered string: %s\nReversed string is: %s\n", string, r);
    free(r);
}

char *rev(char *str) {
    int i, j;
    int size = strlen(str);
    char *rev = malloc(sizeof(*rev) * (size + 1));

    for (i = size - 1, j = 0; i >= 0; i--, j++) {
        rev[j] = str[i];
    }

    rev[size] = '[=10=]';
    return rev;
}

请注意,此代码容易受到缓冲区溢出的影响。

这里有主要的 UB。首先你分配了在函数 return 之后不可用的本地存储数组。第二个 - 大小太小,无法容纳字符串加上终止零