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

时间:2017-02-11 09:57:55

标签: c string

如何在C中创建一个只返回传递给它的字符串值的函数,例如在main()中给出的示例中,我想"规范化"字符串" wackY!"只是"古怪!"。我已经设法使用一个void函数来直接修改字符串在其内存位置,但我想要做的不是修改字符串本身,而只是返回它的修改版本。

我该怎么做?

printf("%s\n", normalize(string));

我的规范化功能

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

在main()

char *string = "wACkY!";
printf("%s\n", string);
printf("%s\n", normalize(string));

4 个答案:

答案 0 :(得分:1)

  1. 使用您传递的字符串大小创建一个新的堆内存,请考虑为'\ 0'字符添加+1。使用malloc或calloc。
  2. 使用memcpy或strncpy在新堆内存上写入。

  3. 使用normalize函数执行的操作更改新内存。

  4. 并返回新的字符*

答案 1 :(得分:1)

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

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

#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!

答案 2 :(得分:0)

您需要编写一个函数,该函数从调用者接收缓冲区以将修改后的字符串放入其中,或者为其返回的已修改字符串分配新内存。

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

答案 3 :(得分:-1)

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

以下显示了它的外观

#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!

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