Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用在C中的for循环中工作不正常的变量定义字符串的大小_C_String_C Strings - Fatal编程技术网

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

使用在C中的for循环中工作不正常的变量定义字符串的大小,c,string,c-strings,C,String,C Strings,我试图反转用户输入的字符串,这里的问题是在使用size=strlen(STR)时函数*rev获取字符串的长度并将其传递到revS[size]的大小,程序会为反向字符串输出一些垃圾值!如果我在revS[10]中传递一些值,而不是size,并运行程序,它将按预期工作。我已经检查了sizeas的值 printf("\nlength of string is: %d\n",size); 它给出了正确的值。我不明白哪里出了问题 #include<stdio.h> #include<st

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

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);  
}

问题是您的反向字符串是在堆栈而不是堆上分配的。当
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;
}
#包括
#包括
#包括
字符*版本(字符*);
int main(){
字符串[100];
printf(“输入要反转的字符串:”);
scanf(“%s”,字符串);
char*r=rev(字符串);
printf(“您输入的字符串:%s\n相反的字符串是:%s\n”,字符串,r);
自由(r);
}
字符*rev(字符*str){
int i,j;
int size=strlen(str);
char*rev=malloc(sizeof(*rev)*(size+1));
对于(i=size-1,j=0;i>=0;i--,j++){
rev[j]=str[i];
}
版次[大小]='\0';
返回版本;
}

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

这里有一些主要的UBs。首先,分配函数返回后不可用的本地存储阵列。第二个-大小太小,无法容纳字符串加终止零

不要从函数返回指向局部变量的指针。局部变量在堆栈上,返回后就不存在了。您知道
revS
在堆栈上,并且超出了范围btw change
scanf(“%s”,string)
scanf(“99%s”,字符串)以防止缓冲overruns@EdHeal:
revS
具有自动存储持续时间,并在函数返回时停止存在。范围是名称可见的位置;生命周期是对象存在的时间。这些是非常不同的;对象可能存在并且可以从其名称不在范围内的代码中访问。@EdHeal那么它如何使用revS[8]而不是使用revS[size]?您是对的,但即使我在then function rev()中打印revS,它也不会给出任何输出!是的,因为你不能说
数组[size\u var]
。这是一个编译时内存分配,编译器无法知道
size\u var
将是什么,因此它只是一个垃圾值。但编译器在
数组[size\u var]
中使用
size\u var
之前,手头有
size=strlen(STR)的值;字符转数[大小]所有这些都是在运行时发生的。编译发生在这之前,当您执行
gccmyprogram.c
时。编译器确定堆栈上为所有函数变量的每帧分配多少空间,因此您告诉它使用未初始化的垃圾值创建一个数组。哦,我知道了。如果大小太小,无法容纳字符串+终止零,那么当我提供revS[9]而不是size=9时,它是如何工作的;转速[尺寸];对于长度为8的输入mahaveer!UB意味着一切都可能发生。它有时可能有效,有时无效。
#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;
}