c - 字符串连接。 C

标签 c string

下面的所有代码都在 C 上。

下面两个代码片段都编译通过了,不同的是第二个程序在启动时崩溃了。

一:

#include <stdio.h>
#include <string.h>

void main() {
    char *foo = "foo";
    char *bar = "bar";
    char *str[80];;
    strcpy (str, "TEXT ");
    strcat (str, foo);
    strcat (str, bar);
}

两个:

#include <stdio.h>
#include <string.h>

void main() {
    char *foo = "foo";
    char *bar = "bar";
    char *str="";
    strcpy (str, "TEXT ");
    strcat (str, foo);
    strcat (str, bar);
}

不同的是,第一种情况表示str字符串的大小,而第二种情况则不是。如何在不直接指示字符串 str 大小的情况下进行字符串连接?

最佳答案

The difference is that in the first case, said the size of the str string, while the second is not.

没有。在第一个程序中,如下语句

char *str[80];

str 定义为指向字符的 80 指针数组。你需要的是一个字符数组——

char str[80];

在第二个程序中,

char *str="";

str 定义为指向字符串文字 "" 的指针,而不是数组。数组和指针是不同的类型。

现在,第二个程序崩溃了,因为

char *str="";

str 定义为指向字符串文字的指针。 strcpy 的第一个参数应该是一个指向缓冲区的指针,该缓冲区足够大,可以复制第二个参数指向的字符串。

但是,str 指向分配在只读内存中的字符串文字""。通过将 str 传递给 strcpy,它调用了未定义的行为,因为 strcpy 试图修改它,这是非法的。未定义的行为意味着行为是不可预测的,任何事情都可能发生,从程序崩溃到由于段错误(非法内存访问)或您的硬盘驱动器被格式化。您应该始终避免调用未定义行为的代码。

How to make string concatenation without a direct indication of the size of the string str?

目标字符串必须足够大以存储源字符串,否则 strcpy 将溢出其第一个参数指向的缓冲区并由于非法内存访问而调用未定义的行为。同样,目标字符串必须有足够的空间供源字符串附加到它,否则 strcat 将溢出缓冲区并再次导致未定义的行为。在这种情况下,您应该通过指定字符串 str 的正确大小来确保避免这种情况。

关于c - 字符串连接。 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23166125/

相关文章:

c - 将不同的单词保存到链接列表中

c - 如何在 C 中 shmget 和 shmat 双数组?

c++ - 在 C++ 中使用 sprintf 和 std::string

java - 改进java字符串比较方法的运行时间和风格?

c# - 从文件路径中删除 'head' 目录

java - 在大型应用程序中使用更好的方法

objective-c - OSX - 如何获取 NSTask 的内存使用情况?

c - Linux 内核中的进入和退出打印

c - 反虚拟机的定时检查效果不佳?

c++ - 如何将 long long ASCII 十六进制值转换为字符串?