如何编写从用户接受两个字符串的C程序并打印一个字符串,该字符串是两个字符串前半部分串联的结果。对于奇数长度的字符串,额外的字符位于字符串的前半部分。
到目前为止我有这个但是对于分成两部分感到困惑......
printf("Please enter your first word.\n"); //Asks for first string
scanf("%s",&c); //Takes first string
printf("Please enter your second word.\n"); //Asks for second string
scanf("%s",&d); //Takes second string
strcat(c,d); //Combines both strings
答案 0 :(得分:0)
void concathalf(const char *a, const char *b, char *out)
{
char *abuf, *bbuf;
if ((abuf = malloc(strlen(a) / 2)) && (bbuf = malloc(strlen(b) / 2))) {
memcpy(abuf, a, strlen(a) / 2);
memcpy(bbuf, b, strlen(b) / 2);
abuf[strlen(a) / 2] = bbuf[strlen(b) / 2] = 0;
}
sprintf(out, "%s%s", abuf, bbuf);
free(abuf);
free(bbuf);
}
现在,处理奇数长度输入将留作练习。
答案 1 :(得分:0)
如果你只是想打印出结果而不是关心字符串c和d的内容,你可以做一些像
这样的事情。#include <stdio.h>
#include <string.h>
int main(void) {
char c[1024]; // c string buffer
char d[1024]; // d string buffer
// initialize to empty strings
c[0] = '\0';
d[0] = '\0';
// read strings c and d
scanf("%s", c);
scanf("%s", d);
// just to make sure there is no overflow
c[1023] = '\0';
d[1023] = '\0';
// cut strings in middle
c[(strlen(c) + 1)/2] = '\0';
d[(strlen(d) + 1)/2] = '\0';
// print final string
printf("%s", c);
printf("%s\n", d);
return 0;
}
(strlen(c)+ 1)/ 2的结果符合你的要求,因为它执行整数除法。如果strlen(c)给出偶数大小,那么加1会使它成为下一个奇数,对整数除法没有影响。如果另一方面,数字是奇数,添加一个将使它成为下一个甚至实现你需要的四舍五入。 &#39; \ 0&#39;将确保该字符串在该点终止。
如果您不想丢失两个字符串的信息或需要存储的结果字符串,那么您可以执行类似
的操作#include <stdio.h>
#include <string.h>
int main(void) {
char c[1024]; // c string buffer
char d[1024]; // d string buffer
char r[1024]; // resulting string buffer
int i; // general counter
int c_half_len; // c half length
int d_half_len; // d half length
// initialize to empty strings
c[0] = '\0';
d[0] = '\0';
r[0] = '\0';
// read strings c and d
scanf("%s", c);
scanf("%s", d);
// just to make sure there is no overflow
c[1023] = '\0';
d[1023] = '\0';
// get c and d half lengths rounding up
c_half_len = (strlen(c) + 1)/2;
d_half_len = (strlen(d) + 1)/2;
// copy first half c string to begining of result
for (i = 0; i < c_half_len; ++i) {
r[i] = c[i];
}
// copy first half d string after the end of the first half string
for (i = 0; i < d_half_len; ++i) {
r[c_half_len + i] = d[i];
}
// add an end of string character
r[c_half_len + d_half_len] = '\0';
// print final string
printf("%s\n", r);
return 0;
}
在这两种情况下,我都假设两个字符串具有最大长度,在本例中为1024(包括字符串字符的结尾)。如果不是这种情况,那么你需要使用动态内存来处理事情。