使用在 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 之后不可用的本地存储数组。第二个 - 大小太小,无法容纳字符串加上终止零
我试图反转用户输入的字符串,这里的问题出在函数*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 之后不可用的本地存储数组。第二个 - 大小太小,无法容纳字符串加上终止零