【问题标题】:_strrev function isnt working inside a function, but works outsidestrrev 函数在函数内部不起作用,但在外部起作用
【发布时间】:2015-12-04 17:58:01
【问题描述】:

我试图让_strrev 函数工作,但是当我将字符串放入函数时,它似乎不起作用,就在我离开函数时.. 我很沮丧,因为我对此无能为力。 到目前为止,这是我的代码

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void reverse(char *string) {
    char *str, temp;
    int begin = 0, end = 0;
    char word[64];
    int jaja = 0;

    printf("Your string from the function is %s\n", string);
    printf("%s\n", _strrev(&string)); //And why isnt this working
    jaja = strlen(string);
    printf("Your string has %d characters\n", jaja);
}
int main()
{
    char *str;
    scanf("%s", &str);
    printf("%s\n", _strrev(&str)); //How come this works

    reverse("Okay");

    getchar();
    return(0);
}

所以我希望得到一些指导,我的错误在哪里,我真的找不到它。

【问题讨论】:

  • 在什么情况下不起作用?预期输出是什么,您看到的输出是什么?
  • @ch3rub7 根据MSDN strrev 已弃用,必须改用_strrev
  • 我得到了各种垃圾 och 字母,而不是颠倒的字符串。然后程序崩溃了。
  • &amp;str 更改为str 并将char *str; 更改为char str[1000];。这并不完全安全,因为如果您输入超过 999 个字符,scanf 仍然可能超出缓冲区,但它应该可以帮助您开始。
  • 调用reverse("Okay") 会导致未定义的行为,因为不允许您修改字符串文字。要解决这个问题,您可以使用字符串文字来初始化char 的数组并将该数组传递给reverse。例如。 char okay[] = "Okay"; reverse(okay);

标签: c string reverse


【解决方案1】:

根据MSDN_strrev的原型是

char *_strrev(
   char *str 
);

如果你有char *string,你必须这样称呼它:

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

在这种情况下

printf("%s\n", _strrev(&string));

你正在传递一个char**

【讨论】:

    【解决方案2】:

    回答您在代码 cmets 中发布的问题:

    int main()
        {
            char *str;
            scanf("%s", &str);
            printf("%s\n", _strrev(&str)); //How come this works
    

    这很有效,因为您很幸运,因为您对scanf() 的调用会将它读取的任何内容放入用于指针str 的实际内存中,并且您没有输入足够的数据来导致问题。在运行这个程序时尝试输入一个很长的字符串,它也不会正常工作。

    您实际上需要有一个char 缓冲区来读取数据,如下所示:

    int main()
        {
            char str[256];
            scanf("%s", str);
            printf("%s\n", _strrev(str));
    

    int main()
        {
            char *str = malloc( 256 );
            scanf("%s", str);
            printf("%s\n", _strrev(str));
    

    正如问题的 cmets 所指出的,您仍然可以超出缓冲区。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-27
      • 2020-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多