2

所以我正在练习使用 K&R 编写带有指针的 c 代码。对于strcat函数的一个问题,我无法找出我的代码出了什么问题,根据 Visual Studio,它在 strcat 函数之后返回目标字符串不变。任何建议表示赞赏!

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int strcat(char* s, char* t);
int main(void)
{
char *s="hello ", *t="world";
strcat(s,t);
printf("%s",s);
return 0;
}

int strcat(char* s,char* t)
{
int i;
i=strlen(s)+strlen(t);
s=(char*) malloc(i);
while(*s!='\0')
    s++;
while('\0'!=(*s++=*t++))
    ;
return 0;
}
4

6 回答 6

1

1)以这种方式定义字符串

char *s="hello "

表示您被定义为文字字符串。文字字符串被保存到只读存储器中,因此您无法对其进行编辑

您必须将字符串定义为 char 数组才能对其进行编辑

char s[100] = "hello ";

2)当你以这种方式定义你的功能时

int strcat(char* s,char* t)

您不能将地址更改s为函数strcat()。因此,将内存分配malloc()到函数中不会s在离开函数时更改地址

3)将您的功能 strcat 更改为

int strcat(char** s,char* t)
{
    int i;
    char *u, *v;
    i=strlen(*s)+strlen(t);
    v = *s;
    u=(char*) malloc(i+1);
    while(*v!='\0')
        *u++ = *v++;
    while('\0'!=(*u++=*t++));
    *s = u;
    return 0;
}

你主要用以下方式调用它:

char *s="hello ", *t="world";
strcat(&s,t);
于 2013-07-09T07:38:00.623 回答
1

 strcat(char* s, char* t) 

's' 是按值发送的。调用时 's' 的值被复制到堆栈中,然后调用 strcat()。在 strcat 返回时,修改后的版本从堆栈中丢弃。所以's'的调用值永远不会改变(并且你会创建内存泄漏)。

Beward,在 C 中,每个存储单元都可以更改,甚至是参数或指令部分;有些变化可能很难理解。

于 2013-07-09T07:39:36.300 回答
1
  1. 我很确定在实际实现中strcat返回 a char*(保存第一个字符串的原始值)。
  2. strcat不应该改变第一个参数的地址,所以你不应该调用malloc.
  3. 第 2 点意味着您需要声明char *schar s[20]in main(其中20某个任意数字大到足以容纳整个字符串)。

如果你真的想改变输入参数的值,你需要传递值的地址——所以它需要strcat(char **s, ...)在函数声明/定义中,并用strcat(&s, ...)in调用main

于 2013-07-09T07:40:01.387 回答
0
#include<stdio.h>
#include<string.h>
#define LIMIT 100
void strcatt(char*,char*);
main()
{   
int i=0;
char s[LIMIT];
char t[LIMIT];
strcpy(s,"hello");
strcpy(t,"world");
strcatt(s,t);
printf("%s",s);
getch();
}
void strcatt(char *s,char *t)
{   

while(*s!='\0')
{    
 s++;
}
*s=' ';
++s;
while(*t!='\0')
{
    *s=*t;
    s++;
    t++;
}
*s=*t;
}
于 2014-05-21T15:34:02.973 回答
0

由于您尝试像真正的 strcat 那样做,据说第一个参数

The string s1 must have sufficient space to hold the result.

所以你不需要使用 malloc

char *strcat(char* s, const char* t);
int main(void)
{
  char s[15] = {0}; // 
  char *t = "world";  //const char * so you can't change it

  strcpy(s, "Hello ");
  strcat(s,t);
  printf("%s\n",s);
  return (0);
}

char *strcat(char* s, const char* t)
{
  int i = 0;

  while (s[i] != '\0')
    i++;
  while (*t != '\0')
    s[i++] = *t++;
  s[i] = '\0'; //useless because already initialized with 0
  return (s);
}
于 2013-07-09T08:15:38.657 回答
0

尊敬的用户

你不必把事情复杂化。最简单的代码strcat,使用指针:

void strcat(char *s, char *t) {
    while(*s++); /*This will point after the '\0' */
    --s; /*So we decrement the pointer to point to '\0' */
    while(*s++ = *t++); /*This will copy the '\0' from *t also */
}

虽然,这不会给你报告连接的成功。

查看这main()部分的其余答案:

int main() {
    char s[60] = "Hello ";
    char *t  = "world!";

    strcat(s, t);
    printf("%s\n", s);

    return 0;
}

s[60]部分非常重要,因为如果它没有足够的空间,你就不能将另一个字符串连接到它的末尾。

于 2015-12-29T17:38:45.507 回答