0

这纯粹是为了个人利益,而不是家庭作业。

#include <stdio.h>

int main(void)
{
    char* str3;

    char* str1 = "Hello";
    char* str2 = "World!";

    while(*str1) str1++;
    while(*str1++ = *str2++);

    return 0;
}

我正在尝试更好地理解 C 指针,在此过程中,我想连接两个字符串并将结果放入第三个字符串中。上面的(不完整的)代码会导致段错误,我不知道为什么。是否可以遍历指针引用的值并将数据复制到另一个地址?

编辑:

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

int main(void)
{
    char* str1 = "Hello";
    char* str2 = "World!";

    char *str3 = malloc(strlen(str1) + strlen(str2) + 1);

    while(*str1) *str3++ = *str1++;
    while(*str2) *str3++ = *str2++;

    puts(str3);

    return 0;
}

新的尝试在上面,虽然没有功能,但是否有我需要修复的“明显”项目?

4

5 回答 5

6
    while(*str1) str1++;

这会继续前进str1,直到它指向字符串常量末尾的终止零字节。

    while(*str1 = *str2++);

这会修改字符串末尾的终止零字节,但字符串是常量,因此无法修改。

如果要在内存中组合字符串,则需要分配一些空间来执行此操作或使用执行此操作的函数。你可以这样做:

char *new_string = malloc(strlen(str1) + strlen(str2) + 1);
strcpy(new_string, str1);
strcat(new_string, str2);

第一行分配了足够的空间来保存str1' 的内容、str2' 的内容和终止的零字节。

于 2013-10-24T17:06:19.020 回答
1
  int main(void)
  {
      char* str1 = "Hello";
      char* str2 = "World!";
      // allocate one more byte for string terminate cher ('\n')
      int size = strlen(str1) + strlen(str2);
      char* str3 = (char*)malloc(size + 1);
      char* str_mod = str3;

      while( (*str_mod++ = *str1++) != '\0');
      str_mod--;
      while( (*str_mod++ = *str2++) != '\0');

      printf ( "%s", str3);
      free (str3);

      return 0;
  }
于 2013-10-24T17:12:31.050 回答
0

常量字符串不可修改。您没有修改 str3。你需要

  1. 得到str1和str2的长度。
  2. str1 的 malloc 长度 + 长度 str2 + 1 并分配给 str3
  3. 如果您喜欢复制,可以使用 while 循环,或者您可以使用 strcpy 和 strcat 将字符串复制到 str3。

由于您正在尝试学习,因此我尽量不为您编写代码。

于 2013-10-24T17:13:46.327 回答
0
int main (void){
    char* str1 = "Hello";
    char* str2 = "World";

    int size1 = strlen(str1);
    int size2 = strlen(str2);
    int i = 0;

    char* out = malloc(sizeof(char)*(size1+size2)+1);

    for (i = 0; i < size1; i++){
        out[i] = str1[i];
    }
    for (i = 0; i < size2; i++){
        out[i+size1] = str2[i];
    }
    out[strlen(out)-1] = \0;
    //out is a string.
    //dont forget to free when you are done.  free(out);

}

自从我做 C 以来已经有几个月了,但这会奏效。我的语法可能略有偏差。

于 2013-10-24T17:13:57.837 回答
0

有问题的第二次尝试错过了将字符串终止 null 到str3. 因此puts,如果在读取无效地址之前没有 0 字节,则读取超出数据末尾,打印垃圾,甚至可能崩溃。添加*str3 ='\0';后循环。

此外,您修改str3并丢失了字符串的开头。再添加一个变量,保留返回的指针malloc,并将其传递给puts. 当前代码将在新字符串的末尾开始打印。

然后,当您有指向字符串文字的指针时,请将它们设为指向 const char 的指针,因为通常字符串文字位于只读内存区域中:

const char* str1 = "Hello";
const char* str2 = "World!";
于 2013-10-24T19:14:45.743 回答