【问题标题】:printf wrong output when reversing a string [duplicate]反转字符串时printf错误输出[重复]
【发布时间】:2018-11-20 20:51:54
【问题描述】:

所以这是反转字符串的代码

#include<stdio.h>

char* function(char *);
int main()
{   
   char a[]="computer";
   printf("%s", function(a));
   return 0;
}

char* function(char *p)
{
   int l,i;
   char t;
   for (l=0;*(p+l)!='\0';l++);
   for(i=0; i<(l/2) ; i++)
    {
        t=*(p+i);
        *(p+i)=*(p+l-1-i);
        *(p+l-1-i)=t;
    }

   return (p);
}

但如果我将主体中的printf("%s", function(a)); 更改为

printf("%s", function("computer"));

在 dev c++ 中没有输出(输出为空白)....但它在 turbo c++ 中提供了所需的输出,即使进行了此更改....为什么会这样?

【问题讨论】:

  • 当您使用第二个版本写入字符串文字时,您的程序会调用未定义的行为。这个网站上至少有一千个这个问题的重复,但标题很少反映实际问题,而且差异很大,很难找到。 Turbo C++ 可能比 更老,所以请使用现代编译器并将您的警告提高到迂腐水平。
  • 提示:不要在算术表达式中使用l1i
  • @TimRandall 因为我们可以把它弄混对不对?
  • @AnasAziz 是的,很难阅读。我个人不喜欢使用单字母变量名,除非在 for 循环或含义非常明显的情况下。我喜欢尽可能使用一两个单词的名字。

标签: c string pointers printf reverse


【解决方案1】:

您传递给function 的参数"computer" 是一个字符串文字,更改/操作字符串文字的内容是未定义的行为。这就是你正在经历的——一些未定义的东西。

【讨论】:

  • 但是为什么它在 turboC++ ide 中运行良好?
  • @Anas:因为 1980 年代的软件没有检查程序员是否遵循语法规则。它只是希望他们这样做。
猜你喜欢
  • 2013-04-17
  • 2023-03-31
  • 1970-01-01
  • 2020-08-15
  • 2011-03-11
  • 2013-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多