#include <stdio.h> #include <stdlib.h> #include <string.h> char* change(char *s[], int n); int main(void) { char poem[4][20]; int n, i; for (i = 0; i < 4; i++) { fgets(poem[i], sizeof(poem[i]), stdin); } printf("%s", change(poem, 4)); return 0; } char* change(char *s[], int n) { char* a = NULL; a = (char*)malloc(sizeof(char) * 10); int i; for (i = 0; i < n; i++) { a[2 * i] = s[i][0]; a[2 * i + 1] = s[i][1]; } a[2 * i] = '\0'; return a; }输入一首诗,这段代码并没有输出由每行诗首个字组成的字符串,原因出在哪里?
时间: 2024-01-22 21:02:18 浏览: 75
这段代码的问题在于输出的时候使用了 %s 格式化符号,但是实际上返回的是一个字符数组的地址。%s 格式化符号是用来输出以空字符结尾的字符串的,因此会导致输出不正确。
为了解决这个问题,可以使用循环遍历字符数组,逐个输出其中的字符。同时,为了避免输出多余的字符,应该在循环中判断当前字符是否为空字符,如果为空字符,则退出循环。
修改后的代码如下所示:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* change(char *s[], int n);
int main(void)
{
char poem[4][20];
int n, i;
for (i = 0; i < 4; i++)
{
fgets(poem[i], sizeof(poem[i]), stdin);
}
char* result = change(poem, 4);
for (i = 0; result[i] != '\0'; i++)
{
printf("%c", result[i]);
}
return 0;
}
char* change(char *s[], int n)
{
char* a = NULL;
a = (char*)malloc(sizeof(char) * 10);
int i;
for (i = 0; i < n; i++)
{
a[2 * i] = s[i][0];
a[2 * i + 1] = s[i][1];
}
a[2 * i] = '\0';
return a;
}
```
修改后的代码中,输出结果时使用了循环逐个输出字符的方式,确保输出结果正确。同时,为了方便输出,将返回值赋值给了一个指针变量 result。
阅读全文