【问题标题】:What is going on with the string output in console [duplicate]控制台中的字符串输出发生了什么[重复]
【发布时间】:2021-09-14 20:37:31
【问题描述】:

我对 C 很陌生。

能否请您指出我的代码的哪一部分(函数、一些运算符、错误的字符串声明等)在控制台中产生以下输出:

我希望有 OmelianLevkovych

以下代码sn-p:

#include <stdio.h>
#include <stdlib.h>

const char* GetFullName(char firstName[], char lastName[])
{
    return strcat(firstName, lastName);
}

int main()
{

    char firstName[] = "Omelian";
    char lastName[] = "Levkovych";

    char* fullName;

    fullName = GetFullName(firstName, lastName);

    printf("%s", fullName);
    return 0;
}

我正在使用 Code.Block IDE 20.03(默认的 hello-world 模板项目)。

【问题讨论】:

  • char firstName[] = "Omelian"; 将创建一个完全适合该字符串的数组。尝试向其写入更多内容,就像您对 strcat 所做的那样,会导致未定义的行为。一种解决方法是声明一个更大的数组:char firstName[128] = "Omelian";
  • @kaylum,对不起,你的意思是我的 GetFullName 函数实际上返回了相同的第一个字符串,对吧?所以strcat() 不会创建另一个字符串文字,而是实际上返回第一个字符串作为结果(显然还添加了另一个字符串)?
  • 很有趣,我只是把这段代码放在 onlinegdb.com 中,它就可以工作了。虽然它不应该:D
  • @effenok 它有时可以工作。取决于内存中名字字符串后面的内容。
  • “未定义的行为”就是这个意思。有时它“有效”,有时则无效。行为可以从一个运行到下一个运行,从一个系统到另一个系统,使用不同的编译器标志等。一旦你调用 UB(在这种情况下,覆盖数组的边界),所有的赌注都是关于如何从那时起程序将继续执行。

标签: c


【解决方案1】:

您没有在字符串 firstname 中分配足够的空间。 Strcat 将 lastname 附加到 firstname 字符串并返回指向 firstname 字符串的指针。

快速解决方法是:

char firstName[30] = "Omelian";

【讨论】:

  • 谢谢,所以“问题”是我很幸运知道strcat() 是如何工作的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-16
  • 1970-01-01
  • 2012-02-01
  • 1970-01-01
  • 2012-05-06
  • 2014-08-30
相关资源
最近更新 更多