如何在C中只返回字符串的值?

如何在C中只返回字符串的值?,c,string,C,String,如何在C中生成一个函数,只返回传递给它的字符串的值,例如在main()中给出的示例中,我想将字符串“wACkY!”标准化为“wACkY!”。我已经用一个void函数成功地做到了这一点,它直接在字符串的内存位置修改字符串,但我想做的不是修改字符串本身,而是返回它的修改版本 我该怎么做? 我的规范化函数 大体上 您需要编写一个函数,该函数要么从调用方接收缓冲区以将修改后的字符串放入其中,要么为其返回的修改后的字符串分配新内存 虽然为您提供此功能并不困难,但我觉得您应该作为一个学习练习自己完成。要为要

如何在C中生成一个函数,只返回传递给它的字符串的值,例如在main()中给出的示例中,我想将字符串“wACkY!”标准化为“wACkY!”。我已经用一个void函数成功地做到了这一点,它直接在字符串的内存位置修改字符串,但我想做的不是修改字符串本身,而是返回它的修改版本

我该怎么做? 我的规范化函数 大体上
您需要编写一个函数,该函数要么从调用方接收缓冲区以将修改后的字符串放入其中,要么为其返回的修改后的字符串分配新内存

虽然为您提供此功能并不困难,但我觉得您应该作为一个学习练习自己完成。要为要返回的字符串分配新内存,请查看
malloc()

< LI>创建一个新的堆内存,它的字符串大小已经过了,请考虑添加+1用于“\\”字符。使用malloc或calloc
  • 使用memcpy或strncpy在新堆内存上写入

  • 使用normalize函数对新内存进行更改

  • 并返回新字符*


  • 我认为更灵活的方法是当函数获取目标字符串作为参数并执行源字符串的复制时

    下面显示了它的外观

    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
    
    char * copy_normalized( char *s1, const char *s2 )
    {
        char *p = s1;
    
        while ( isspace( ( unsigned char )*s2 ) ) *p++ = *s2++;
    
        *p = toupper( ( unsigned char )*s2 );
    
        while ( *s2 ) *++p = tolower( ( unsigned char )*++s2 );
    
        return s1;
    }   
    
    int main( void ) 
    {
        char s[] = "wACkY!";
        char t[sizeof( s )];
    
        puts( s );
        puts( copy_normalized( t, s ) );
    
        printf( "\n" );
    
        char *p = malloc( sizeof( s ) );
    
        puts( s );
        puts( copy_normalized( p, s ) );
    
        free( p );
    
        return 0;
    }
    

    您可以添加一个检查,以确保应转换为大写的字符是字母字符。

    您可以在不使用
    malloc()
    的情况下执行此操作,从而通过使用VLA和更改
    normalize()的函数原型来避免潜在的内存泄漏
    接受作为新字符串数组的附加参数

    在下面的程序中,通过使用
    strlen()
    查找
    string
    的长度并为
    '\0'
    终止符添加空间,在
    main()
    中找到其大小后,在
    main()
    中声明字符数组
    newstring[]
    。请注意,函数
    normalize()
    通过指向
    的指针
    修改字符数组
    newstring[]
    ,以便在函数调用后,可以在
    main()
    内的
    newstring[]
    中看到效果。但是
    newstring[]
    还返回指向
    newstring[]
    中第一个字符的指针,允许调用
    normalize()
    生成的字符串直接由
    printf()
    打印


    C没有字符串类型;C只有字符数组,而且你从
    main
    到现有函数的调用无论如何都不应该起作用,除非你的实现特别慷慨。这是一个只读字符串文字,由非常量指针寻址,并传递给试图就地修改它的函数,不管这个问题的答案是什么,我做到了。成功了。但是我用malloc创建的新字符串会发生什么呢。在使用函数return返回内存后,是否有办法释放内存?是的。将返回的动态分配和修改的char*(字符串!)保存到变量中。你可以释放这个变量。但是,如果使用printf(“%s\n”),则规范化(字符串));在这种情况下,内存位置将是孤立的,这意味着不会释放以供重用。因此,最好执行以下操作:char*modifiedString=normalize(string);printf(“%s\n”,modifiedString);自由(修改字符串);所有的人都很抱歉这个缩进!在注释中,它们不允许这样的事情。对于规范化自由函数,返回char*(我的观点)是没有意义的。因为您已经通过将char*更新为返回。所以更好的软件工程应该是使用void类型返回。@Ehsan——我不同意。1) 返回指针允许直接使用返回值,例如在
    printf()
    中。2) 如果函数输入因某种原因被视为不正确或函数中出现错误,则返回指针允许函数返回
    NULL
    。考虑到许多库函数,例如<代码> fgScript(),返回一个指向修改后的缓冲区的指针。总的来说,我发现返回这样一个指针是一个有用的特性。是的!你是对的!在这种情况下,我同意你的观点。对于规范化自由函数,返回char*(我的观点)是没有意义的。因为您已经通过将char*更新为返回。所以更好的软件工程应该是使用void类型的返回。正是我的观点@Ehsan所有C标准字符串函数都确认此约定。这允许在一条语句中链接多个字符串函数调用。所以用户定义的函数也应该遵循这个约定。
    char *normalize(char *a) {
    printf("%s\n", a);
    int i = 0;
    a[i] = toupper(a[i]);
    for (i = 1; a[i] != '\0'; ++i) {
        a[i] = tolower(a[i]);
    }
    return a;
    }
    
    char *string = "wACkY!";
    printf("%s\n", string);
    printf("%s\n", normalize(string));
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
    
    char * copy_normalized( char *s1, const char *s2 )
    {
        char *p = s1;
    
        while ( isspace( ( unsigned char )*s2 ) ) *p++ = *s2++;
    
        *p = toupper( ( unsigned char )*s2 );
    
        while ( *s2 ) *++p = tolower( ( unsigned char )*++s2 );
    
        return s1;
    }   
    
    int main( void ) 
    {
        char s[] = "wACkY!";
        char t[sizeof( s )];
    
        puts( s );
        puts( copy_normalized( t, s ) );
    
        printf( "\n" );
    
        char *p = malloc( sizeof( s ) );
    
        puts( s );
        puts( copy_normalized( p, s ) );
    
        free( p );
    
        return 0;
    }
    
    wACkY!
    Wacky!
    
    wACkY!
    Wacky!
    
    #include <stdio.h>
    #include <string.h>
    #include <ctype.h>
    
    char * normalize(char *to, char *from)
    {
        strcpy(to, from);
    
        for (size_t i = 0; from[i] != '\0'; i++) {
            to[i] = tolower(from[i]);
        }
    
        to[0] = toupper(to[0]);
    
        return to;
    }
    
    int main(void)
    {
        char *string = "wACkY!";
        size_t newstring_sz = strlen(string) + 1;
        char newstring[newstring_sz];
    
        printf("%s\n", string);    
        normalize(newstring, string);
        printf("%s\n", newstring);
    
        /* Alternatively */
        string = "wACkY!";
        printf("%s\n", string);    
        printf("%s\n", normalize(newstring, string));
    
        return 0;
    }
    
    wACkY!
    Wacky!
    wACkY!
    Wacky!