猪猪虾 发表于 2020-11-6 22:36:25

c,程序很短,16行报错

#include <stdio.h>
//打印字母
# define char_line 7//每个字母的行数
void print_I();
char print_c();

int main()
{
   int i,m,n;
   printf("请输入两个字符间的间隔数目(空格数目):");
   scanf("%d:",&i);
   char letter;
   letter = print_c();
   for(m = 0; m < char_line ; m++)
   {
          printf("%s",*(letter + m));
   }
   print_c();
   return 0;
}

char print_c()
{
   char *letter = {
           "#####   \n",
           "##   ##\n",
           "##       \n",
           "##       \n",
           "##       \n",
           "##   ##\n",
           "#####   \n"};
                 
        return letter;
}

void print_I()
{
   printf("######   \n");
   printf("    ##   \n");
   printf("    ##   \n");
   printf("    ##   \n");
   printf("    ##   \n");
   printf("    ##   \n");
   printf("######   \n");
}

永恒的蓝色梦想 发表于 2020-11-6 22:42:56

你在想什么???letter+m 是一个字符耶!

永恒的蓝色梦想 发表于 2020-11-6 22:44:36

我看不懂你要干什么。发题目。

猪猪虾 发表于 2020-11-6 22:49:34

永恒的蓝色梦想 发表于 2020-11-6 22:44
我看不懂你要干什么。发题目。

题目就是调用函数,横向打印两个字母

永恒的蓝色梦想 发表于 2020-11-6 23:00:24

猪猪虾 发表于 2020-11-6 22:49
题目就是调用函数,横向打印两个字母

横向打印两个字母???#include<stdio.h>
int main(){printf("aa");return 0;}这个代码就行

shooan 发表于 2020-11-7 09:21:09

报错帮你解决了,也能打印出两个字符了,但是不是横向的。错误的原因已经注释在代码里面了

#include <stdio.h>
//打印字母
# define char_line 7//每个字母的行数
void print_I();
char** print_c();                // 同 22 行

int main()
{
   int i,m,n;
   printf("请输入两个字符间的间隔数目(空格数目):");
   scanf("%d:",&i);
   char** letter;
   letter = print_c();
   for(m = 0; m < char_line ; m++)
   {
            printf("%s",*(letter + m));
   }
   print_I(); // print_c()
   return 0;
}

char** print_c()                // 修改的地方 返回值应该是char ** 而不是 char
{
   static char *letter = {                 // 修改的地方, 弄成static的表示这个letter不再是临时变量了,print_c函数调用结束后,letter不会被回收
         "#####   \n",
         "##   ##\n",
         "##       \n",
         "##       \n",
         "##       \n",
         "##   ##\n",
         "#####   \n"};
                  
      return letter;
}

void print_I()
{
   printf("######   \n");
   printf("    ##   \n");
   printf("    ##   \n");
   printf("    ##   \n");
   printf("    ##   \n");
   printf("    ##   \n");
   printf("######   \n");
}

https://ftp.bmp.ovh/imgs/2020/11/15ef0f373f99543e.png

大神本人 发表于 2020-11-7 11:33:08

把printf的s改成c

猪猪虾 发表于 2020-11-7 21:52:35

shooan 发表于 2020-11-7 09:21
报错帮你解决了,也能打印出两个字符了,但是不是横向的。错误的原因已经注释在代码里面了

“”返回值应该是char ** 而不是 char“”
请问这里怎么理解

shooan 发表于 2020-11-7 22:39:43

猪猪虾 发表于 2020-11-7 21:52
“”返回值应该是char ** 而不是 char“”
请问这里怎么理解

根据main里面的这个代码 // 我修改后的代码的第14行到第16行
   for(m = 0; m < char_line ; m++)
   {
            printf("%s",*(letter + m));
   }
可以知道,你想要把print_c 的返回值,也就是 letter给当成指向char的数组(也就是指针数组) 来用
而且,print_c 里面也把 letter 给声明成了 指向char的数组(也就是指针数组),所以返回值应该是char** 而不是 char

zhujx 发表于 2020-11-8 18:46:46

shooan 发表于 2020-11-7 09:21
报错帮你解决了,也能打印出两个字符了,但是不是横向的。错误的原因已经注释在代码里面了

对楼上的代码的解读:
1.字符串数组letter,在char **print_c()函数中,letter是个临时变量,在main函数调用后,letter的内存会被释放,方法一就是楼上的的加static,方法二:定义一个全局的letter;
2.char *letter是个字符数组,函数返回应该是指针的指针,双重指针。
页: [1]
查看完整版本: c,程序很短,16行报错