我正试图反转用户输入的字符串输入,这里的问题出在函数*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 . . .
答案 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。首先,您分配函数返回后不可用的本地存储阵列。第二个-大小太小,无法容纳字符串加上零结尾