肚子饿了233 发表于 2021-1-14 20:11:19

C语言!为毛编译器显示出这个鬼?!

本帖最后由 肚子饿了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="100000000090",p2="2000000000010",p3;
        int i,x=strlen(p1),y=strlen(p2);
        if(x<y)
        {
                for(i=x;i>=0;i--)
                {
                        p1=p1;
                        p1='0';
                }
                x=y;
        }
        if(x>y)
        {
                for(i=y;i>=0;i--)
                {
                        p2=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='\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;
                p3=k+'0';
        }
}
程序要求两数相加。
编译器显示出了这个鬼 :*'0////////00   ??

请各位大佬走过路过帮俺瞧瞧,5555

jackz007 发表于 2021-1-14 20:53:41

本帖最后由 jackz007 于 2021-1-14 21:03 编辑

#include <stdio.h>
#include <string.h>

void reverse(char s[])
{
      char c                      ;
      int i , m                   ;
      for(m = 0 ; s ; m ++)    ;
      for(i = 0 ; i < m / 2 ; i ++) {
                c = s    ;
                s = s ;
                s = c            ;
      }
}

char * add(char c[] , char a[] , char b[])
{
      char * p1 , * p2 , * p3                      ;
      int e , i , j                              ;
      if(strlen(a) > strlen(b)) {                  // 用 p1、p2 分别指向 a、b,p1 指向其中较长的那个字符串;
                p1 = a                               ;
                p2 = b                               ;
      } else {
                p1 = b                               ;
                p2 = a                               ;
      }                     
      reverse(a)                                 ; // 因为加法计算需要从个位数开始,字符串反序
      reverse(b)                                 ; // 因为加法计算需要从个位数开始,字符串反序
      for(i = 0 ; p1 ; i ++) c = p1 - '0' ; // 用比较长的字符串初始化字符串 c
      for(e = i = j = 0 ; p1 ; i ++) {
                if(e) c ++                        ; // 如果前一次操作的进位标志为 1
                e = 0                              ; // 进位标志清零
                if(p2) c += p2 - '0'   ; // 如果 p2 没有到尽头,那就加上 p2
                if(c > 9) {                         // 如果 c 超过 9
                        c -= 10                   ; // 进位处理
                        e = 1                        ; // 置进位标志
                }
                c += '0'                        ; // 把数字变成相应的字符
      }
      if(e) c = '1'                        ; // 如果加完了还有进位标志,那就在最高位补一个字符 '1'
      c = '\0'                                  ; // 置字符串结束标志
      reverse(a)                                 ; // 字符串反序,恢复字符串 a 的原始状态
      reverse(b)                                 ; // 字符串反序,恢复字符串 b 的原始状态
      reverse(c)                                 ; // 字符串反序,恢复字符串 c 的正常状态
      return c                                     ;
}

int main(void)
{
      char p1="100000000090" , p2= "2000000000010" , p3 ;
      printf("%s\n" , add(p3 , p1 , p2))                            ;
}
      编译、运行实况
D:\00.Excise\C>g++ -o x x.c

D:\00.Excise\C>x
2100000000100

D:\00.Excise\C>

风过无痕1989 发表于 2021-1-14 21:16:49

本帖最后由 风过无痕1989 于 2021-1-15 15:04 编辑

#include<stdio.h>
#include<string.h>
void add(char p1[], char p2[], char p3[], int n);
main()
{
        char p1 = "100000000090", p2 = "2000000000010", p3;
        int i, x = strlen(p1), y = strlen(p2);
        if (x<y)
        {
                for (i = x;i >= 0;i--)
                {
                        p1 = p1;
                        p1 = '0';
                }
                x = y;
        }
        if (x>y)
        {
                for (i = y;i >= 0;i--)
                {
                        p2 = 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 = '\0';
        for (i = n - 1;i >= 0;i--)
        {
                p3 = (p1 - '0') + (p2 - '0') + k;    // 若用加法,则 p1 + p2 有可能超出字符型数字的定义而出错,所以应该用减法,暂时将字符型数字的运算转换为整型数字的运算
                k = p3 / 10;                               // 两数相加,若大于 10,就会有进位
                p3 = p3 % 10 + '0';                     // 整型数字运算完成后,再转换为字符型数字存入 p3 数组
        }
        if (k)                                                // 若首位有进位(k != 0),则通过循环,将所有数字后移一位
        {
                for (i = n + 1;i>0;i--)
                        p3 = p3;
                p3 = k + '0';
        }
}

永恒的蓝色梦想 发表于 2021-1-14 23:17:14

你拿个指针加字符是什么鬼

永恒的蓝色梦想 发表于 2021-1-14 23:18:04

风过无痕1989 发表于 2021-1-14 21:16


p1,p2,p3都是指针。。。。

风过无痕1989 发表于 2021-1-14 23:53:33

永恒的蓝色梦想 发表于 2021-1-14 23:18
p1,p2,p3都是指针。。。。

指针能赋值给数组元素?    p1 = p1;
指针能作除法?   k = p3 / 10;
指针能作取余运算?   p3 = p3 % 10 + '0';

肚子饿了233 发表于 2021-1-15 12:03:12

风过无痕1989 发表于 2021-1-14 23:53
指针能赋值给数组元素?    p1 = p1;
指针能作除法?   k = p3 / 10;
指针能作取余运算?   p3 = p ...

大佬别打架。是这个页面的问题,我发现方括号无法显示?p自动显示出来pi,也不知道为什么。

风过无痕1989 发表于 2021-1-15 13:19:39

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

你说是页面的问题,我就明白了,教你一招,如何发代码,看下图:
https://xxx.ilovefishc.com/album/202009/19/115416qe98e8zc9nbknb9z.jpg

风过无痕1989 发表于 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 楼

永恒的蓝色梦想 发表于 2021-1-21 18:17:46

风过无痕1989 发表于 2021-1-14 23:53
指针能赋值给数组元素?    p1 = p1;
指针能作除法?   k = p3 / 10;
指针能作取余运算?   p3 = p ...

那是因为他的代码没用代码格式,没了……
从声明也能看出来啊……

风过无痕1989 发表于 2021-1-21 18:28:31

永恒的蓝色梦想 发表于 2021-1-21 18:17


于是我修改了帖子,并在第8层告诉他怎么发帖子了
页: [1]
查看完整版本: C语言!为毛编译器显示出这个鬼?!