[英]Concatenating two strings in C and placing the result into a third string
这纯粹是出于个人利益,而不是作业。
#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;
}
以上是新的尝试,虽然没有起作用,但是否需要修复“明显”的项目?
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
的内容以及终止的零字节。
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;
}
常量字符串不可修改。 您没有修改str3。 你需要
由于您正在尝试学习,因此我尝试不为您编写代码。
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语言以来已经有几个月了,但这行得通。 我的语法可能会略有偏离。
有问题的第二次尝试未将终止为null的字符串放在str3
。 因此, puts
读取数据之外的结束,打印无用的,如果有读无效地址前没有0字节甚至可能崩溃。 添加*str3 ='\\0';
之后循环。
此外,您修改str3
并丢失字符串的开头。 再添加一个变量,保留malloc
返回的指针,并将其传递给puts
。 当前代码将在新字符串的末尾开始打印。
然后,当您有指向字符串文字的指针时,使它们成为const char的指针,因为通常字符串文字位于只读存储区中:
const char* str1 = "Hello";
const char* str2 = "World!";
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.