任务:从输入流中读取几行。第一行包含数字N -剩余行数(测试),N < 32。接下来的N行中的每一行包含两个由空格分隔的单词。(每个单词的长度不超过32个).每对单词都要取一个新词,使第一个的结尾与第二个的开头重合,例如,mountain + insane = mountainsane。这个单词应该输出到标准输出流。如果可以用几种方式连接单词,你应该选择提供最大公共部分的一种,例如papa + papaha = papaha(不是papapapaha)。
备注:不能使用“%c”格式逐字符输出最终字符串。必须使用“%s”格式形成并输出整个字符串。
验证码:
#include <stdio.h>
#include <string.h>
int word_length(char* str)
{
unsigned short int i;
for (i = 0; str[i] != '\0'; i++);
return i;
}
int main() {
char word_1[32], word_2[32], line[64][64];
unsigned short int n, line_number, i, j, k;
scanf("%hu", &n);
for(line_number = 0; line_number < n; line_number++){
scanf("%s %s", word_1, word_2);
if(word_2[0] == word_1[0] && word_2[1] == word_1[1]){
for(i = 0; i < word_length(word_2); i++){
line[line_number][i] = word_2[i];
}
}
else{
for(j = 0; j < word_length(word_1); j++){
if(word_2[0] != word_1[j]){
line[line_number][j] = word_1[j];
}
else{
line[line_number][j] = word_2[j];
break;
}
}
for(k = j; k <= word_length(word_2); k++){
line[line_number][k] = word_2[k - 1];
}
}
}
printf("\n");
for(line_number = 0; line_number < n; line_number++){
printf("%s\n", line[line_number]);
}
return 0;
}
字符串
基本的思路是通过第一个单词,寻找与第二个单词的第一个字母匹配的单词。如果字母不同,那么单词1的字母就被写下来,如果它们匹配,那么单词2的所有字母都被写下来。然而,我不确定这个逻辑是否正确。
| 尝试|想到|修得|
| --|--|--|
| 爸爸妈妈|帕帕马马|帕帕|
| 山地疯|芒廷桑|芒泰|
| 玩瑜伽|普拉约加|plaga|
| 木瓜|木瓜|木瓜|
2条答案
按热度按时间e4eetjau1#
关于OP代码:
1.太多的垂直空间(使用2xSP闪存)使其难以阅读。
1.重写
strlen()
没有明显的原因。(string.h
已被包括在内。)char w1[32];
(和w2
)不考虑尾随NUL。char line[64][64];
完全不合适。1.没有验证来自
scanf()
的返回代码。1.循环似乎只是对解决方案的猜测。
没有规定所有的行都必须被缓冲后才能输出。每一行都可以/应该像它的两个字组成的那样输出。
下面是可以工作的带注解的代码(使用编译的“字符串”,而不是从文件中阅读输入):
字符串
输出量:
型
挑战的关键是认识到并从“最大可能的重叠”开始,并从那里开始工作。
新的一天,代码调整:
函数的
while()
循环可以缩短以简化代码:型
ymdaylpp2#
我不知道它是否100%正确(我也不确定任务本身[描述太简短,没有解释很多角落案例]),也没有太多时间来检查,但它与您的测试案例一起工作。
1.请使用函数。
1.不要将简单的任务过于复杂化。
字符串
https://godbolt.org/z/xP1nsazMG
输出量:
型