萌王利姆露 发表于 2023-2-6 21:00:30

c语言基础问题

```c
#include<stdio.h>

#define N 50

char* Link(char *s,char *t)
{
        char string;
        int i = 0;
        for (; *(s + i) != '\0'; i++)
        {
                string = *(s + i);
        }
        for (int j = i + 1,k = 0; *(t + i) != '\0'; j++, k++)
        {
                string = *(t + k);
        }
        return string;
}
int main()
{
        char s = {'\0'}, t = { '\0' }, *string;
        printf("Please input the first string:");
        gets(s);
        printf("Please input the second string:");
        gets(t);
        *string = Link(s, t);
        printf("The linked string is:");
        puts(string);
        return 0;
}
```

![图片.png](data/attachment/forum/202302/06/205936q1tqoo0g1eg10mog.png)
功能是拼接两个字符串,但是最后打印出来是乱码,真是搞不懂哦

wwwwwllllk 发表于 2023-2-6 22:14:30

这是学校的作业吗

王一之 发表于 2023-2-6 22:20:12

string = *(s + i);

槽点太多,让我们有请 @李恒道

李恒道 发表于 2023-2-6 23:38:08

char* Link(char *s,char *t)
{
    char *string = (char *) malloc(strlen(s) + strlen(t));
    int i = 0;
    for (; *(s + i) != '\0'; i++)
    {
      string = *(s + i);
    }
    for (int j = 0; *(t + j) != '\0'; j++)
    {
      string = *(t + j);
    }
    return string;
}
可以试试这个
最好贴出来报错

cxxjackie 发表于 2023-2-7 00:40:16

int j = i + 1 这句错了吧,上面for循环结束的时候i已经是+1的状态了,再+1会造成中间跳过了一个字符,所以变乱码了。

Vikrant 发表于 2023-2-7 01:54:01

本帖最后由 Vikrant 于 2023-2-7 02:24 编辑

童鞋,你的代码好像槽点有一点多欸~~

哈哈,不过不怕,我给你指出来( ´・・)ノ(._.`):

1. 也是我认为最大的一个槽点,你的Link函数返回了一个函数内部定义的字符串指针,这样指针直接虚空索敌了。建议使用全局指针(bushi) (划掉)……建议直接给函数传入目标指针。或者也可以给函数内部定义的指针使用static关键字,这样函数退出的时候就不会释放这部分内存啦~ 当然了,也可以给内部的指针使用malloc、calloc、realloc等函数动态分配的内存,但是!千万记住!一定要用完了以后释放掉!(这个是血的教训~( TロT)σ )

2. 你在main函数里定义了一个char *string,我知道你这里想定义一个char* ,但事实上数组名是指针,又套上一个指针定义,这里的类型是char** 。建议改成char string。

3. for (int j = i + 1,k = 0; *(t + i) != '\0'; j++, k++),这里面有什么问题呢?首先,应该是int j=i,不用+1。然后,你的循环判断条件是*(t + i)!='\0',这里面没有一个值会在循环时改变,这可能会死循环(你这里没有死循环时因为刚好*(t + i)=='\0'),这里应该是*(t + k)!='\0'

4. 呐,还有!字符串的末尾最好补上一个'\0',这样稳妥一点,虽然好像不加也没有出错欸ㄟ( ▔, ▔ )ㄏ……

下面是我改的代码,可以正常运行哦(* ̄3 ̄)╭

#include <stdio.h>
#define N 50

char *Link(char *s, char *t, char *string) {
      int i = 0;
      for (; *(s + i) != '\0'; i++) {
                string = *(s + i);
      }
      int j = i;//既然你上面写外面,那我也这样写喽~ 绝对不是我想把j的作用域移出来。
      for (int k = 0; *(t + k) != '\0'; j++, k++) {
                string = *(t + k);
      }
      string = '\0';
}
int main() {
      char s = {'\0'}, t = {'\0'}, string;
      printf("Please input the first string:");
      gets(s);
      printf("Please input the second string:");
      gets(t);
      Link(s, t, string);
      printf("The linked string is:");
      puts(string);
      return 0;
}


萌王利姆露 发表于 2023-2-7 09:44:47

Vikrant 发表于 2023-2-7 01:54
童鞋,你的代码好像槽点有一点多欸~~

哈哈,不过不怕,我给你指出来( ´・・)ノ(._.`):


哥哥太强了叭{:4_86:}好扎实的基本功
页: [1]
查看完整版本: c语言基础问题