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 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-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';
}
} 你拿个指针加字符是什么鬼 风过无痕1989 发表于 2021-1-14 21:16
p1,p2,p3都是指针。。。。 永恒的蓝色梦想 发表于 2021-1-14 23:18
p1,p2,p3都是指针。。。。
指针能赋值给数组元素? p1 = p1;
指针能作除法? k = p3 / 10;
指针能作取余运算? p3 = p3 % 10 + '0'; 风过无痕1989 发表于 2021-1-14 23:53
指针能赋值给数组元素? p1 = p1;
指针能作除法? k = p3 / 10;
指针能作取余运算? p3 = p ...
大佬别打架。是这个页面的问题,我发现方括号无法显示?p自动显示出来pi,也不知道为什么。 肚子饿了233 发表于 2021-1-15 12:03
大佬别打架。是这个页面的问题,我发现方括号无法显示?p自动显示出来pi,也不知道为什么。
你说是页面的问题,我就明白了,教你一招,如何发代码,看下图:
https://xxx.ilovefishc.com/album/202009/19/115416qe98e8zc9nbknb9z.jpg 本帖最后由 风过无痕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 楼 风过无痕1989 发表于 2021-1-14 23:53
指针能赋值给数组元素? p1 = p1;
指针能作除法? k = p3 / 10;
指针能作取余运算? p3 = p ...
那是因为他的代码没用代码格式,没了……
从声明也能看出来啊…… 永恒的蓝色梦想 发表于 2021-1-21 18:17
于是我修改了帖子,并在第8层告诉他怎么发帖子了
页:
[1]