-1

我正在使用 Visual Studio 做简单的 c 练习。使用 strcat_s 函数,我通过以下代码收到违规异常:

char *str1;
str1 = (char *)malloc(20);
*str1 = "Ciao ";
char *str2 = "Marco";
strcat_s(str1, sizeof(str1), str2);
printf("%s", str1);

现在,如果我使用一个固定大小的预定义数组,strcat_s 可以完美运行。如何使用指向 char 而不是数组的指针来使其工作?

任何其他解决方案或提示将不胜感激。

先感谢您。

4

2 回答 2

1

您必须首先将字符串复制到分配的内存中。如果您想知道字符串的长度,请使用strlen(). sizeof()返回数据类型的大小(以字节为单位)。在您的情况下,它是一个指针(在 32 位机器上为 4 个字节,在 64 位机器上为 8 个字节)。以下代码应该可以正常工作:

char *str1 = (char *)malloc(20);
strcpy(str1,"Ciao ");
char *str2 = (char *)malloc(20);
strcpy(str2,"Marco ");
strcat(str1, str2);
printf("%s", str1);
于 2017-05-17T15:12:38.453 回答
0

您的代码存在一些问题,并且有一些关于strcat_s.

您的代码str1 = (char *)malloc(20); *str1 = "Ciao "不会复制Ciao*str是 的第一个位置的单个字符str,并且您的表达式将字符串文字"Ciao "(它是指向字符序列的指针)转换为某个单个字符(T在这种情况下;令人惊讶,不是吗?)。一个人需要strcpy改用。相比之下,像 一样的数组是char buffer[20] = "Ciao "有效的,因为这种(特殊)情况不是赋值,而是数组的初始化器。

您的代码sizeof(str1)为您提供了指针值的大小,它可能是4or 8,与内容的实际大小或保留的内存块无关。应该strlen改用。

关于strcat_s,应该考虑到它并非在所有平台上都可用,并且您必须了解它的特殊行为。例如,如果您调用strcat_s(somebuffer, 3, "somestrlongerthan3")超过所提供的最大长度的3somebuffer将是一个“空”字符串(即第一个字符将设置为\0.

我建议使用strncatorsnprintf代替。请参阅以下变体:

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

int main () {

    char c = "Ciao ";  // Gives a compiler warning and yields 'T'

#define maxlen 20

    // Variant 1: start with initialized buffer, yet no "pointer" and dynamic allocation
    char resultBuffer[maxlen] = "Ciao ";
    size_t charactersRemaining = maxlen-strlen(resultBuffer)-1;
    strncat(resultBuffer, "Marco", charactersRemaining);

    // Variant 2: use dynamically allocated buffer and snprintf, with constant "Ciao".
    char *resultBuffer2 = malloc(maxlen);
    const char* second2 = "Marco";
    snprintf(resultBuffer2, maxlen, "Ciao %s", second2);

    // Variant 3: use dynamically allocated buffer and snprintf, with probably variable "Ciao" and "Marco"
    char *resultBuffer3 = malloc(maxlen);
    const char* first3 = "Ciao";
    const char* second3 = "Marco";
    snprintf(resultBuffer3, maxlen, "%s %s", first3, second3);

    return 0;
} 
于 2017-05-17T16:01:42.247 回答