鱼C论坛

 找回密码
 立即注册
查看: 1518|回复: 10

[已解决]C语言!为毛编译器显示出这个鬼?!

[复制链接]
发表于 2021-1-14 20:11:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 肚子饿了233 于 2021-1-14 20:45 编辑

#include<stdio.h>
#include<string.h>
void add(char p1[],char p2[],char p3[],int n);
main()
{
        char p1[80]="100000000090",p2[80]="2000000000010",p3[80];
        int i,x=strlen(p1),y=strlen(p2);
        if(x<y)
        {
                for(i=x;i>=0;i--)
                {
                        p1[i+y-x]=p1;
                        p1='0';
                }
                x=y;
        }
        if(x>y)
        {
                for(i=y;i>=0;i--)
                {
                        p2[i+x-y]=p2;
                        p2='0';
                }
        }
        add(p1,p2,p3,x);
        puts(p3);
}
void add(char p1[],char p2[],char p3[],int n)
{
        int k=0,i;
        p3[n]='\0';
        for(i=n-1;i>=0;i--)
        {
                p3=(p1+'0')+(p2+'0')+k;   // 为毛是p1-'0',p2-'0'才对?为啥换成减号才ok呢?
                k=p3/10;
                p3=p3%10+'0';
        }
        if(k)
        {
                for(i=n+1;i>0;i--)
        p3=p3[i-1];
                p3=k+'0'  ;
        }
}
程序要求两数相加。
编译器显示出了这个鬼 :*'0////////00   ??

请各位大佬走过路过帮俺瞧瞧,5555
最佳答案
2021-1-14 21:16:49
本帖最后由 风过无痕1989 于 2021-1-15 15:04 编辑
  1. #include<stdio.h>
  2. #include<string.h>
  3. void add(char p1[], char p2[], char p3[], int n);
  4. main()
  5. {
  6.         char p1[80] = "100000000090", p2[80] = "2000000000010", p3[80];
  7.         int i, x = strlen(p1), y = strlen(p2);
  8.         if (x<y)
  9.         {
  10.                 for (i = x;i >= 0;i--)
  11.                 {
  12.                         p1[i + y - x] = p1[i];
  13.                         p1[i] = '0';
  14.                 }
  15.                 x = y;
  16.         }
  17.         if (x>y)
  18.         {
  19.                 for (i = y;i >= 0;i--)
  20.                 {
  21.                         p2[i + x - y] = p2[i];
  22.                         p2[i] = '0';
  23.                 }
  24.         }
  25.         add(p1, p2, p3, x);
  26.         puts(p3);
  27. }
  28. void add(char p1[], char p2[], char p3[], int n)
  29. {
  30.         int k = 0, i;
  31.         p3[n] = '\0';
  32.         for (i = n - 1;i >= 0;i--)
  33.         {
  34.                 p3[i] = (p1[i] - '0') + (p2[i] - '0') + k;    // 若用加法,则 p1[i] + p2[i] 有可能超出字符型数字的定义而出错,所以应该用减法,暂时将字符型数字的运算转换为整型数字的运算
  35.                 k = p3[i] / 10;                               // 两数相加,若大于 10,就会有进位
  36.                 p3[i] = p3[i] % 10 + '0';                     // 整型数字运算完成后,再转换为字符型数字存入 p3 数组
  37.         }
  38.         if (k)                                                // 若首位有进位(k != 0),则通过循环,将所有数字后移一位
  39.         {
  40.                 for (i = n + 1;i>0;i--)
  41.                         p3[i] = p3[i - 1];
  42.                 p3[i] = k + '0';
  43.         }
  44. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-1-14 20:53:41 | 显示全部楼层
本帖最后由 jackz007 于 2021-1-14 21:03 编辑
  1. #include <stdio.h>
  2. #include <string.h>

  3. void reverse(char s[])
  4. {
  5.         char c                      ;
  6.         int i , m                   ;
  7.         for(m = 0 ; s[m] ; m ++)    ;
  8.         for(i = 0 ; i < m / 2 ; i ++) {
  9.                 c = s[m - 1 - i]    ;
  10.                 s[m - 1 - i] = s[i] ;
  11.                 s[i] = c            ;
  12.         }
  13. }

  14. char * add(char c[] , char a[] , char b[])
  15. {
  16.         char * p1 , * p2 , * p3                      ;
  17.         int e , i , j                                ;
  18.         if(strlen(a) > strlen(b)) {                    // 用 p1、p2 分别指向 a、b,p1 指向其中较长的那个字符串;
  19.                 p1 = a                               ;
  20.                 p2 = b                               ;
  21.         } else {
  22.                 p1 = b                               ;
  23.                 p2 = a                               ;
  24.         }                       
  25.         reverse(a)                                   ; // 因为加法计算需要从个位数开始,字符串反序
  26.         reverse(b)                                   ; // 因为加法计算需要从个位数开始,字符串反序
  27.         for(i = 0 ; p1[i] ; i ++) c[i] = p1[i] - '0' ; // 用比较长的字符串初始化字符串 c
  28.         for(e = i = j = 0 ; p1[i] ; i ++) {
  29.                 if(e) c[i] ++                        ; // 如果前一次操作的进位标志为 1
  30.                 e = 0                                ; // 进位标志清零
  31.                 if(p2[j]) c[i] += p2[j ++] - '0'     ; // 如果 p2 没有到尽头,那就加上 p2
  32.                 if(c[i] > 9) {                         // 如果 c[i] 超过 9
  33.                         c[i] -= 10                   ; // 进位处理
  34.                         e = 1                        ; // 置进位标志
  35.                 }
  36.                 c[i] += '0'                          ; // 把数字变成相应的字符
  37.         }
  38.         if(e) c[i ++] = '1'                          ; // 如果加完了还有进位标志,那就在最高位补一个字符 '1'
  39.         c[i] = '\0'                                  ; // 置字符串结束标志
  40.         reverse(a)                                   ; // 字符串反序,恢复字符串 a 的原始状态
  41.         reverse(b)                                   ; // 字符串反序,恢复字符串 b 的原始状态
  42.         reverse(c)                                   ; // 字符串反序,恢复字符串 c 的正常状态
  43.         return c                                     ;
  44. }

  45. int main(void)
  46. {
  47.         char p1[80]="100000000090" , p2[80]= "2000000000010" , p3[80] ;
  48.         printf("%s\n" , add(p3 , p1 , p2))                            ;
  49. }
复制代码

        编译、运行实况
  1. D:\00.Excise\C>g++ -o x x.c

  2. D:\00.Excise\C>x
  3. 2100000000100

  4. D:\00.Excise\C>
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-14 21:16:49 | 显示全部楼层    本楼为最佳答案   
本帖最后由 风过无痕1989 于 2021-1-15 15:04 编辑
  1. #include<stdio.h>
  2. #include<string.h>
  3. void add(char p1[], char p2[], char p3[], int n);
  4. main()
  5. {
  6.         char p1[80] = "100000000090", p2[80] = "2000000000010", p3[80];
  7.         int i, x = strlen(p1), y = strlen(p2);
  8.         if (x<y)
  9.         {
  10.                 for (i = x;i >= 0;i--)
  11.                 {
  12.                         p1[i + y - x] = p1[i];
  13.                         p1[i] = '0';
  14.                 }
  15.                 x = y;
  16.         }
  17.         if (x>y)
  18.         {
  19.                 for (i = y;i >= 0;i--)
  20.                 {
  21.                         p2[i + x - y] = p2[i];
  22.                         p2[i] = '0';
  23.                 }
  24.         }
  25.         add(p1, p2, p3, x);
  26.         puts(p3);
  27. }
  28. void add(char p1[], char p2[], char p3[], int n)
  29. {
  30.         int k = 0, i;
  31.         p3[n] = '\0';
  32.         for (i = n - 1;i >= 0;i--)
  33.         {
  34.                 p3[i] = (p1[i] - '0') + (p2[i] - '0') + k;    // 若用加法,则 p1[i] + p2[i] 有可能超出字符型数字的定义而出错,所以应该用减法,暂时将字符型数字的运算转换为整型数字的运算
  35.                 k = p3[i] / 10;                               // 两数相加,若大于 10,就会有进位
  36.                 p3[i] = p3[i] % 10 + '0';                     // 整型数字运算完成后,再转换为字符型数字存入 p3 数组
  37.         }
  38.         if (k)                                                // 若首位有进位(k != 0),则通过循环,将所有数字后移一位
  39.         {
  40.                 for (i = n + 1;i>0;i--)
  41.                         p3[i] = p3[i - 1];
  42.                 p3[i] = k + '0';
  43.         }
  44. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-14 23:17:14 From FishC Mobile | 显示全部楼层
你拿个指针加字符是什么鬼
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-14 23:18:04 From FishC Mobile | 显示全部楼层
风过无痕1989 发表于 2021-1-14 21:16

p1,p2,p3都是指针。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-14 23:53:33 | 显示全部楼层
永恒的蓝色梦想 发表于 2021-1-14 23:18
p1,p2,p3都是指针。。。。

指针能赋值给数组元素?    p1[i + y - x] = p1;
指针能作除法?     k = p3 / 10;
指针能作取余运算?     p3 = p3 % 10 + '0';
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-15 12:03:12 | 显示全部楼层
风过无痕1989 发表于 2021-1-14 23:53
指针能赋值给数组元素?    p1 = p1;
指针能作除法?     k = p3 / 10;
指针能作取余运算?     p3 = p ...

大佬别打架。是这个页面的问题,我发现方括号无法显示?p自动显示出来pi,也不知道为什么。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-15 13:19:39 | 显示全部楼层
肚子饿了233 发表于 2021-1-15 12:03
大佬别打架。是这个页面的问题,我发现方括号无法显示?p自动显示出来pi,也不知道为什么。

你说是页面的问题,我就明白了,教你一招,如何发代码,看下图:

                               
登录/注册后可看大图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-15 14:41:44 | 显示全部楼层
本帖最后由 风过无痕1989 于 2021-1-15 14:53 编辑
肚子饿了233 发表于 2021-1-15 12:03
大佬别打架。是这个页面的问题,我发现方括号无法显示?p自动显示出来pi,也不知道为什么。


解决了不是代码的问题后,你的程序的错误在第 34 行: p3[ i ] = (p1[ i ] + '0') + (p2[ i ] + '0') + k;
只要将两个加号改为减号,程序输出就正常了。
改减号的理由:p1[ i ] 、p2[ i ] 都是字符型数字,它们相加,有可能会超出字符型数字定义(字符 9 是 57,而 58 并非是 10,而是字符冒号 :),改减号 '9' - '0' = 9 ,即暂时将字符数字转换为整型数字,第 35 行为取进位,两条语句运算完成后,再通过第 36 条语句转换为字符型数字存入数组 p3
p3[ i ] = (p1[ i ] - '0') + (p2[ i ] - '0') + k;

PS:  我修改我上面 3 楼的程序,若能给最佳答案,请设置 3 楼
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-21 18:17:46 | 显示全部楼层
风过无痕1989 发表于 2021-1-14 23:53
指针能赋值给数组元素?    p1 = p1;
指针能作除法?     k = p3 / 10;
指针能作取余运算?     p3 = p ...
  1. 那是因为他的代码没用代码格式,[i]没了……
  2. 从声明也能看出来啊……
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-21 18:28:31 | 显示全部楼层

于是我修改了帖子,并在第8层告诉他怎么发帖子了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-20 07:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表