使用在C

时间:2018-07-29 19:28:37

标签: c string c-strings

我正试图反转用户输入的字符串输入,这里的问题出在函数*rev中,当我使用size = strlen(STR);来获取字符串的长度并将其传递为revS[size]程序为反向字符串输出一些垃圾值!如果我传递一些值,而不是size中的revS[10]并运行程序,则它将按预期工作。我已将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] = '\0';
    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 . . .

2 个答案:

答案 0 :(得分:1)

问题是您的反向字符串分配在堆栈而不是堆上。当您的rev函数返回时,该范围内的所有变量将被垃圾回收。您可以使用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] = '\0';
    return rev;
}

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

这是一个repl

答案 1 :(得分:0)

您在这里有主要的UB。首先,您分配函数返回后不可用的本地存储阵列。第二个-大小太小,无法容纳字符串加上零结尾