C程序连接两个字符串
C program to concatenate two strings
我试图在不使用任何 functions.When 的情况下将两个字符串与指针连接在一起,例如,我首先输入两个字符串 hello 然后 world 输出是
你好
世界
而不是 helloworld.Any 帮助将不胜感激。
#include<stdio.h>
#include<stdlib.h>
int main(){
char *s=(char *)malloc(sizeof(char *));
char *s2=(char *)malloc(sizeof(char *));
fgets(s,10,stdin);
fgets(s2,10,stdin);
int i=0;
while(*s){
s++;
i++;
}
while(*s2!='[=10=]'){
*s=*s2;
s++;
s2++;
i++;
}
*s='[=10=]';
printf("%s",s-i);
}
fgets()
读取到文件末尾或行尾,但在读取的数据中包括行尾。
因此在您的情况下,您还将字符串与新行连接起来。
换句话说你的说法char *s=(char *)malloc(sizeof(char *));
正在为 sizeof(char*)
个字符分配内存,即:指针的大小,而不是 X 个字符。
此外,由于您要将一个 10 个字符的字符串与另一个字符串连接起来,因此需要分配该字符串以至少容纳(20 个字符 + 1 个空值)。
程序有未定义的行为,因为您没有为输入的字符串分配内存。
char *s=(char *)malloc(sizeof(char *));
char *s2=(char *)malloc(sizeof(char *));
fgets(s,10,stdin);
fgets(s2,10,stdin);
您只为两个指针(sizeof(char *)
)分配了内存。
您需要分配足够大的内存以包含输入的字符串及其在第一个字符数组中的连接。
函数fgets
可以在输入的字符串后附加换行符'\n'。你需要覆盖它。
此外,您不应更改原始指针,因为您需要使用它们来释放分配的内存。
并考虑到如果您要输入 [=20],结果字符串将至少包含 11
个字符,包括终止零字符 '[=18=]'
而不是 10
个字符=] 和 "world"
并将它们连接起来。虽然一般来说,如果输入的字符串不包含换行符,最好保留 13
个字符。
程序可以按如下方式找例子
#include <stdlib.h>
#include <stdio.h>
int main( void )
{
enum { N = 7 };
char *s1 = malloc( 2 * N - 1 );
char *s2 = malloc( N );
s1[0] = '[=11=]';
s2[0] = '[=11=]';
fgets( s1, N, stdin );
fgets( s2, N, stdin );
char *p1 = s1;
while (*p1 != '\n' && *p1 != '[=11=]') ++p1;
for (char *p2 = s2; *p2 != '\n' && *p2 != '[=11=]'; ++p2)
{
*p1++ = *p2;
}
*p1 = '[=11=]';
puts( s1 );
free( s1 );
free( s2 );
}
程序输出可能是
hello
world
helloworld
而不是这些行
char *s1 = malloc( 2 * N - 1 );
char *s2 = malloc( N );
s1[0] = '[=13=]';
s2[0] = '[=13=]';
你可以写
char *s1 = calloc( 2 * N - 1, sizeof( char ) );
char *s2 = calloc( N, sizeof( char ) );
数组被零初始化以保留空字符串,以防 fgets 的调用被中断。
我试图在不使用任何 functions.When 的情况下将两个字符串与指针连接在一起,例如,我首先输入两个字符串 hello 然后 world 输出是
你好
世界
而不是 helloworld.Any 帮助将不胜感激。
#include<stdio.h>
#include<stdlib.h>
int main(){
char *s=(char *)malloc(sizeof(char *));
char *s2=(char *)malloc(sizeof(char *));
fgets(s,10,stdin);
fgets(s2,10,stdin);
int i=0;
while(*s){
s++;
i++;
}
while(*s2!='[=10=]'){
*s=*s2;
s++;
s2++;
i++;
}
*s='[=10=]';
printf("%s",s-i);
}
fgets()
读取到文件末尾或行尾,但在读取的数据中包括行尾。
因此在您的情况下,您还将字符串与新行连接起来。
换句话说你的说法char *s=(char *)malloc(sizeof(char *));
正在为 sizeof(char*)
个字符分配内存,即:指针的大小,而不是 X 个字符。
此外,由于您要将一个 10 个字符的字符串与另一个字符串连接起来,因此需要分配该字符串以至少容纳(20 个字符 + 1 个空值)。
程序有未定义的行为,因为您没有为输入的字符串分配内存。
char *s=(char *)malloc(sizeof(char *));
char *s2=(char *)malloc(sizeof(char *));
fgets(s,10,stdin);
fgets(s2,10,stdin);
您只为两个指针(sizeof(char *)
)分配了内存。
您需要分配足够大的内存以包含输入的字符串及其在第一个字符数组中的连接。
函数fgets
可以在输入的字符串后附加换行符'\n'。你需要覆盖它。
此外,您不应更改原始指针,因为您需要使用它们来释放分配的内存。
并考虑到如果您要输入 [=20],结果字符串将至少包含 11
个字符,包括终止零字符 '[=18=]'
而不是 10
个字符=] 和 "world"
并将它们连接起来。虽然一般来说,如果输入的字符串不包含换行符,最好保留 13
个字符。
程序可以按如下方式找例子
#include <stdlib.h>
#include <stdio.h>
int main( void )
{
enum { N = 7 };
char *s1 = malloc( 2 * N - 1 );
char *s2 = malloc( N );
s1[0] = '[=11=]';
s2[0] = '[=11=]';
fgets( s1, N, stdin );
fgets( s2, N, stdin );
char *p1 = s1;
while (*p1 != '\n' && *p1 != '[=11=]') ++p1;
for (char *p2 = s2; *p2 != '\n' && *p2 != '[=11=]'; ++p2)
{
*p1++ = *p2;
}
*p1 = '[=11=]';
puts( s1 );
free( s1 );
free( s2 );
}
程序输出可能是
hello
world
helloworld
而不是这些行
char *s1 = malloc( 2 * N - 1 );
char *s2 = malloc( N );
s1[0] = '[=13=]';
s2[0] = '[=13=]';
你可以写
char *s1 = calloc( 2 * N - 1, sizeof( char ) );
char *s2 = calloc( N, sizeof( char ) );
数组被零初始化以保留空字符串,以防 fgets 的调用被中断。