发新话题
打印

请各位大哥挑一下这个程序的毛病?

# include<string.h>
4 H6 z7 ]' P$ f! W4 \8 E# include<stdio.h>
& L5 j: D  u/ E6 h9 vcheck(p1,p2,compare)
$ V+ N) i1 W$ t8 z' N2 y+ bchar *p1,*p2;# I; \/ a& q9 M: D8 ~4 K
int (*compare)();) x5 \0 p9 K' r3 W, Y5 B4 b
{! o! t1 c( g8 o5 {0 o; i
if(!(*compare)(p1,p2))
. }+ E2 p0 O, `' q! v& r9 v+ ?  printf("\n The two strings are equal!");( U* v7 Z/ C- ^& S
else
8 j! _! S  c* h5 a; F  printf("\n The two strings are not equal!");
, M% ~& U: y5 v* ^: l}. H: r! w# g1 Y$ j
numcmp(a,b)+ h4 v/ g, _/ ?& G1 [2 K/ j4 ]
char *a,*b;8 ]) |/ x& r! L; N6 R
{
5 i# b6 o% h, G# D if(atoi(a)==atoi(b))+ @' l' S7 l5 a6 K, G, c4 o
  return(0);
; r# u9 y! p9 n5 L9 p& X* [/ S% ~ else
$ N' t/ ]) I+ S$ b! m  return(1);
) G7 ~- n) `5 t) {1 p9 Q}2 N5 j0 E3 |' [0 Q8 |
main()
; F( V, s9 X8 E& ]! ?{) L1 ?' `$ @; W
int strcmp(),numcmp();; s& s4 ?* R0 w3 U0 q
char str1[100],str2[100];
( s) P4 s  K* H$ L& ` printf("\n Please enter two strings or numbers:");
% `) V0 k6 `! u scanf("%s",str1);" }! Y" I) T; h* [
scanf("%s",str2);
0 o: G% C9 Z3 y printf("\n Please enter 'n' for number compare or enter 'c' for strings compare:");2 X) V, h0 s+ ^( g6 H3 c
if(getchar()=='n')  c% R+ j5 l4 `6 y& E
  check(str1,str2,numcmp);+ D3 Q. _% o: A$ ^3 z- u; G
else
5 ^5 K8 E* `1 d; d& B- H" w  check(str1,str2,strcmp);
9 h/ ^3 |+ |1 m  A5 K. n: H}0 ?% m8 n3 I7 w/ p
: Q4 v0 Y3 O( c0 u$ S7 B* I9 i
这个程序的题目:检查两个输入数或字符串是否相等。
7 T: ]/ H" x1 K7 q  其中
6 H% P* X4 `4 Y' N2 Knumcmp(a,b)
) _; T' q" j+ d( t9 D1 Bchar *a,*b;
$ a3 E3 s7 u( j) p% o1 y0 \{+ b0 t6 n+ ]' V) U: h
if(atoi(a)==atoi(b))4 W3 c" _8 _' y- H- G9 X8 _) `: M
  return(0);
1 ]) A5 J6 ]4 J  O# j5 K  p else8 @" ?+ l6 f2 U/ }' u
  return(1);. `/ z. Y6 X" X, ~# S
}' y3 T& Z, t: }8 H3 o. l7 N
这是一段数比较函数,那么a,b都应该是数,比方说一个2,一个3,为什么这两个又是指针?那么atoi(a)的意思,
. ?2 R+ [. @0 W- y就是把a指针所指的那个数变换,然后进行比较。可是a并没有所指的数呀?- h6 U4 q4 n1 F. ^# I. G4 Y
况且这是数的比较,为什么要用atoi函数(字符转数字)?
5 B1 p' b* F% Y! s* C4 M还有,整个程序运行不能正确运行,估计是
% K0 l9 p  O& z) D5 zmain()
4 r- S+ c# Z! x% ~+ I4 m% B{
- k& M) v9 n8 N  ` int strcmp(),numcmp();0 I, E- L" j' X+ ~4 Y. |& Y5 |9 M% l7 C
char str1[100],str2[100];
9 [5 i! l$ C# ^7 B& N7 S printf("\n Please enter two strings or numbers:");
/ P( ?; z: X! K4 }% y. T scanf("%s",str1);
/ S/ p( j+ A- L' F  V scanf("%s",str2);8 v2 C* s4 I  c# M2 r' J+ L
printf("\n Please enter 'n' for number compare or enter 'c' for strings compare:");
' r5 H+ v% S3 w' M, ~ if(getchar()=='n')/ c2 N7 _5 z9 t! t% t$ @
  check(str1,str2,numcmp);
- W% X! U6 h! h$ ~ else
$ F; l4 N5 d9 D3 \  check(str1,str2,strcmp);
& j0 A& \: }) ~" b- l: y}6 U% e3 p2 I& d/ q- ]* t6 i
这一段的毛病,$ N' I" e3 l( C7 C& P2 m
printf("\n Please enter 'n' for number compare or enter 'c' for strings compare:");/ T% o/ A+ S2 p- o2 A
if(getchar()=='n')
: _' ]5 z% _; J3 d, o根本就没有机会输入n or c?
2 s" @9 t4 J  d, j请各位大哥挑一下这个程序的毛病?      

TOP

怎么没人回答,都不会吗?      

TOP

我会..就是懒

是呀,这里只我会,哈哈.刚好我这几天有没来转.版主也跑了
2 }3 r6 S" C- G' e/ V% ~你读入的是字符类型
, R  `# y# p) Z# _1 d" T scanf("%s",str1);   其中%S就是指字符串,atoi就把字符串转换为数字,其实没必要分两种情况,都当字符串处理也一样.
7 D4 i# A7 q: |getchar reads from stdin and is line buffered; this means it will not return until you press ENTER. 4 }1 K" c) Z9 t' w. n1 D- f
getchar不回显,这样编- A1 L( R5 M2 M

4 k8 @* i5 X5 D9 P) ?while ((c = getchar()) != '\n')
0 x5 b2 |3 R6 Q% z      printf("%c", c);
2 h* Z$ H4 \, d7 z5 E4 H$ {7 {- ~2 M" l1 {8 T* ^: E/ l- c7 Z
你基础还真差,有语法错误,刚学吧,快到我网站去下教材http://neimeng.net$ L! e1 q0 J- N: X+ G1 x2 \6 s
numcmp(a,b) 1 |0 J- s. s7 ~4 X0 t5 G4 V, h
char *a,*b;
8 C+ B- R6 L+ {{
% P# V: A" B$ `- O$ Rif(atoi(a)==atoi(b)) ' |- y$ ]8 b/ f) |. I3 B
return(0);
6 T3 ~1 j7 }, \( Melse + s2 N# h4 f! m1 Y, S1 E
return(1); 6 ]- ]% A7 v. `6 i* E+ X5 L9 B
}
; w1 d3 ]& N+ U改为
" J7 n. {  f6 {, E& }0 m4 T2 bnumcmp(char *a,char *b) 8 j7 l* K& r! u' t# S+ @
{
# \; _1 E' g4 j$ Rif(atoi(*a)==atoi(*b)) 2 [9 Z! P. S) H- ~# Z7 n
return(0); 1 t; K( K5 D9 g' U: g8 T
else 5 B9 B9 X' d+ D4 o* I- O' b3 t4 y) @" ?
return(1);
9 ?& t* G2 ^1 A}   C+ J3 l+ l; B: V3 G3 ^) n
0 O/ X* {6 x- K# Z3 X
在有问题就qq:17069322 Y( e4 f2 D5 s. L8 g5 J& m
      
forlinux@263.net forlinux.yeah.net

TOP

2 T& f/ X$ T$ G8 Q1 I1 ?# F
教程1 ~# `# o) M# {  K" K! d$ o
main()
9 @0 v" A3 l+ _; R. ^     {
3 R# Q- c: E6 T( @" X& c  X          char c1, c2;
2 _$ k' P0 L; i  L* f4 \          scanf("%c", &c1);
& b7 J: k. F2 w6 O          scanf("%c", &c2); 6 P/ k( X1 j. w0 q) u9 G
          printf("c1 is %c, c2 is %c", c2\1, c2); 2 @' `% ^; d) Z' w' M4 @: y% N
     } # B6 N6 _% |$ E  w8 Q& l7 ]  ~

: q; D5 M9 G+ [  U    运行该程序, 输入一个字符A后回车 (要完成输入必须回车), 在执行scanf " |$ K! b* y+ y. s( E4 ]5 Q
("%c", &c1)时, 给变量c1赋值"A", 但回车符仍然留在缓冲区内, 执行输入语句
6 S6 W* C$ W, M3 D* r3 n1 ^scanf("%c", &c2)时, 变量c2输出的是一空行, 如果输入AB后回车, 那么输出结
9 j# ~) `  p) W4 U果为: c1 is A, c2 is B。 3 m- Z8 G5 ]  M
    0 T! B) u, \: g$ l% n" l7 p: q% N
其中
7 U1 W. r4 {/ D3 Q 变量c2输出的是一空行, 如果输入AB后回车, 那么输出结
5 M0 w5 J* l1 W- D, z果为: c1 is A, c2 is B。看不明白?7 i  \# ^+ G0 X# H( \4 T! O! B6 z
c2的A哪去了?+ `) c8 K# O4 V
      

TOP

这里不方便

你把源码发到我邮箱      
forlinux@263.net forlinux.yeah.net

TOP

.

下面是我改的,redhat7.1下gcc编译通过/ n: u" K7 j) T2 G2 n- Q3 h
命令:
- i" {. L/ w; f8 J. K0 jgcc bb.c -o bb$ a% f( {$ O/ W3 L3 V
) k& M# _0 S8 J: i- Z
****************' k. t$ I6 S. l
#include <stdio.h>
4 D5 H6 h+ H! `, Rmain() ' h4 b* f% V3 s
{
1 A' _8 J0 T( O, d; i+ H      char c1, c2; 9 q1 ?9 \, Q/ }8 T" Y2 B- ]
    printf("c1:");* Z4 Y3 S1 ?3 [% D9 [. [* Y$ ^" e
      scanf("%1s", &c1);
; m* T* y7 v0 q0 b: A      printf("c2:");5 N  j2 t" J, G+ [3 B+ A7 l( z
      scanf("%1s", &c2); 3 O( a7 y; |4 R0 b. X  a" X" ]! j
      printf("c1 is %c, c2 is %c", c1, c2); 1 v6 r) s& e) _8 @
}       
forlinux@263.net forlinux.yeah.net

TOP

谢谢,我就想问
/ @8 J7 e* q# `& ~教程(在你的网站找的): g% C3 @# J- w1 r7 `, x( C* r" c
main()
! H' ^( {- `& q5 n0 }' K{
2 w  w* E5 I9 }char c1, c2;
' X6 y) M  N; B0 N" ?/ D- L; Iscanf("%c", &c1);
9 s5 N% M+ G! A1 O0 gscanf("%c", &c2);
9 n* u% D& o7 \printf("c1 is %c, c2 is %c", c2\1, c2);
+ S, X1 r: C  R2 V1 K} + I2 J2 H1 U8 ^( ~9 m. a- H" _
, C; D7 Z+ Y$ V- K' I, ]2 K
运行该程序, 输入一个字符A后回车 (要完成输入必须回车), 在执行scanf # l5 b; w7 b: [- ~
("%c", &c1)时, 给变量c1赋值"A", 但回车符仍然留在缓冲区内, 执行输入语句 % _; h5 N# t( e
scanf("%c", &c2)时, 变量c2输出的是一空行, 如果输入AB后回车, 那么输出结 , I6 w* F2 h, ~
果为: c1 is A, c2 is B。
) L6 Q7 C0 B3 C- |
0 K' \, h9 o) A; d2 }7 I  {& b其中 # D5 k9 u, |9 \! E: t
变量c2输出的是一空行, 如果输入AB后回车, 那么输出结 - R+ |1 I+ s, x) m
果为: c1 is A, c2 is B。看不明白? 6 i. V& a( ]4 H. m$ W& \$ D+ Z
c2的A哪去了?   p0 B& D. E8 H+ H* W( m

1 X4 _/ [2 j& v; ^# T# [4 j就是这个关于scanf的问题,仅此而已
: Q3 b( [+ v( o8 C      

TOP

scanf中的%c是顺序读取输入缓冲区中的内容,并且长度应该与变量的长度匹配,当你输入了A【Enter】后,输入缓冲区中有两个字符‘A’和回车键,scanf("%c",&c1)读取缓冲区中的A,而下一个scanf("%c",&c2)会顺序的读取下一个字符回车键,所以就会显示' e8 K  F% I( L/ X3 u9 [  Q8 x
c1 is A,c2 is, T8 X5 a6 _: t: ~9 s
      

TOP

发新话题