【问题标题】:explanation of strcat() outputstrcat() 输出的解释
【发布时间】:2012-07-09 13:13:56
【问题描述】:

这是来自 295c 的问题之一

#include<stdio.h>   
#include<string.h>        
main()        
{        
    char *a="kammo DJ";         
    const char *b="roomies!!";       
    char *c;         
    a=(char *)malloc(strlen(a) + strlen(b));           
    c=(char *)malloc(strlen(a) + strlen(b));          
    c=strcat(a,b);                          
    printf("%s\n",a);               
}                          

输出是 - 室友!! 但是为什么输出应该是kammo DJ + roomies的串联!! 也说说c的值是多少?

【问题讨论】:

  • strcat 的概要是 char *strcat(char *s1, const char *s2);
  • 它应该是int main(void) 并且没有malloc 的返回。

标签: c strcat


【解决方案1】:

首先,您应该 malloc strlen(a) + strlen(b) + 1 因为 '\0' 符号。您已经声明了char * a = "kammo dj",因此您不能为此分配内存。当您为char * a 执行malloc 时,它返回了创建的内存池malloc 的位置。 如果你这样做:

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

int main()        
{        
    const char *a="kammo DJ";         
    const char *b="roomies!!";       
    char *c;
    size_t len = strlen(a) + strlen(b) + 1;
    c=(char *)malloc(len*sizeof(char));          
    strcpy(c,a);
    strcat(c,b);      
    printf("%s\n",c);
    // don't forget!
    free(c);
    return 0;

}         

将输出'kammo DJroomies(之间没有空格)

【讨论】:

  • 不会的,你应该复制到c
  • @akash 我已经发布了你的答案
  • 输出是 kammo DJroomies!! , free(c) -> free(c);
  • @BLUEPIXY 很抱歉我打错了。
【解决方案2】:

这里的问题是当你这样做时

a=(char *)malloc(strlen(a) + strlen(b));    

这意味着a 不再指向"kammo DJ"。相反,它指向新分配的包含任意数据的内存。

看来a 数据的第一个字节现在指向的恰好是 0,这实际上使a 成为空字符串。这就是为什么你得到的结果只是roomies!!。但这只是运气。

你真正想要的代码是:

#include<stdio.h>   
#include<string.h>        
main()        
{        
    const char *a="kammo DJ";         
    const char *b="roomies!!";       
    char *c;         
    c=(char *)malloc(strlen(a) + strlen(b) + 1);          
    strcpy(c,a);                          
    strcat(c,b);                          
    printf("%s\n",c);               
}

【讨论】:

  • 为什么投反对票?这一切对我来说都是正确的,如果这是您想要的,这是发布的程序的第一个准确更正! (你没有投票,因为它没有修复 main() 返回类型并将强制转换留在 malloc 上是吗?这太苛刻了:-/)
【解决方案3】:
a=(char *)malloc(strlen(a) + strlen(b));

您需要为终止空字符留出空间。字符串的大小是它的长度+空字符的一个字节。此外,a 被声明为指向 "kammo DJ" 字符串文字。在malloc 调用之后,您使指针指向其他东西。

c=strcat(a,b);

a 不是字符串,在malloc 之后包含不确定值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2012-05-19
    • 2014-02-17
    • 2011-05-03
    • 2012-02-17
    相关资源
    最近更新 更多