发新话题
打印

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

# include<string.h>. R. F& v3 U0 d/ c
# include<stdio.h>
  s! q9 @! f* t, H2 C4 s/ Bcheck(p1,p2,compare)+ U% F" L# k  g( j0 L2 e
char *p1,*p2;
% ?* g: U) H! D" Uint (*compare)();
9 ]/ l0 y+ r. @{
2 @" d; k6 f4 \7 I6 _ if(!(*compare)(p1,p2))  Z% t! @. s; e6 ]3 ?
  printf("\n The two strings are equal!");& b+ n. S7 h! }; c
else1 G& G$ H' d& `( k/ b8 S. y
  printf("\n The two strings are not equal!");* N3 S2 ~. S$ N; C2 h0 d
}5 \3 Y' r( j, J# G6 Y* s7 H* m- U
numcmp(a,b): w" }) |/ J$ ?( G
char *a,*b;
$ O$ C  n1 o2 T4 q5 o, P  ?{
- o& _# V# Q9 [+ K- W/ o0 `; `0 ]- I if(atoi(a)==atoi(b))" B/ p; t8 ^' D* C) w/ l
  return(0);8 G: `& ^: m* _# t5 n7 W
else) j. c% c, }8 S- `2 Q
  return(1);
1 h+ w) q- ?# r* i- P# l2 M8 [, @) @}
& ?( S: C) [8 M3 U% Zmain()4 _( g  ^. I. T5 x) x- h
{/ ]3 w6 n  O5 [$ y
int strcmp(),numcmp();
1 U2 X. R" o# n char str1[100],str2[100];$ w/ A& x9 g" |( E3 x9 o4 B
printf("\n Please enter two strings or numbers:");" a3 o# @! x+ a7 v! M! P7 R
scanf("%s",str1);& P( _) `* {$ F
scanf("%s",str2);( x% d8 @3 ^6 d6 G7 V( g$ S
printf("\n Please enter 'n' for number compare or enter 'c' for strings compare:");& c$ E& i: l& h+ `' S
if(getchar()=='n')7 m7 I$ n0 t7 ?* ^# ?9 m
  check(str1,str2,numcmp);
$ i& ~( x# S2 M. l/ d: d else8 I( `* I. U8 T. M. l2 O" ]) F
  check(str1,str2,strcmp);
0 B; y% @, |, f! S: I5 R}
/ w* J2 Y$ s8 O7 B
: m) P" y( D5 a8 \% n 这个程序的题目:检查两个输入数或字符串是否相等。/ Z$ r) f1 }: C+ N  T$ y
  其中
5 l$ S1 _3 L7 ~# G4 \( h; ]% knumcmp(a,b)8 X6 T5 \# A/ H" {/ H/ I4 g2 j
char *a,*b;
) i4 W: F5 c( k( R+ `{9 E" r* }- U: w; G( p& x* v) R  x
if(atoi(a)==atoi(b))2 a1 B! w7 y  i- y$ |
  return(0);
% M  ~, P1 G% f; f else' n. i4 ]3 p2 P% a( P
  return(1);
8 @4 g! ~/ g; x7 b, h}
! D% J' V/ {# U- a- m这是一段数比较函数,那么a,b都应该是数,比方说一个2,一个3,为什么这两个又是指针?那么atoi(a)的意思,: [  T0 E5 E3 p: |
就是把a指针所指的那个数变换,然后进行比较。可是a并没有所指的数呀?
1 D, R# u, Q0 g4 ~' Y; t况且这是数的比较,为什么要用atoi函数(字符转数字)?4 O6 l( q9 H2 b9 D" t3 f+ b
还有,整个程序运行不能正确运行,估计是: {6 [$ K' g% H$ B$ F( v. f. Z
main()
3 _3 |1 w3 t) x: t- |. b{
7 V% q4 w9 T. j5 s) ~ int strcmp(),numcmp();0 l5 D$ w: f/ ]+ q7 v
char str1[100],str2[100];
: R: M$ A8 Z2 v. a% R printf("\n Please enter two strings or numbers:");& o2 h4 o* j7 U* j
scanf("%s",str1);
! r/ M* N% j0 G/ R9 V- h% U1 @$ ~ scanf("%s",str2);
8 }% @' M& o9 V' b printf("\n Please enter 'n' for number compare or enter 'c' for strings compare:");  O) V! q+ G& H
if(getchar()=='n')
  |- f! r4 c; j6 g+ S  check(str1,str2,numcmp);
) X; c3 H8 v' U- H else
  x7 D8 A* {2 C  check(str1,str2,strcmp);% }% _' Y$ h! g- `. i
}3 Q- |2 J+ M1 L+ f/ r' d: R
这一段的毛病,+ ?1 P$ e( l  J, J
printf("\n Please enter 'n' for number compare or enter 'c' for strings compare:");
- W) Y* ?7 S) k$ w9 w" c if(getchar()=='n')
! n; H  g; t/ F# B1 _1 S( F% k根本就没有机会输入n or c?% \  ?% A1 P3 j6 K
请各位大哥挑一下这个程序的毛病?      

TOP

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

TOP

我会..就是懒

是呀,这里只我会,哈哈.刚好我这几天有没来转.版主也跑了
7 \& Y+ R3 w) j. w0 Q* T: Q8 d: Z2 P你读入的是字符类型
) ]/ B& D( B" T  @4 A7 m* K9 k' c scanf("%s",str1);   其中%S就是指字符串,atoi就把字符串转换为数字,其实没必要分两种情况,都当字符串处理也一样.4 H5 Z1 X% m+ @) c
getchar reads from stdin and is line buffered; this means it will not return until you press ENTER.
3 j6 p9 l0 E& Tgetchar不回显,这样编
3 k2 k& |" j( G$ W! P
8 G5 a8 o; u7 V3 i( T6 s- p* e4 gwhile ((c = getchar()) != '\n')
4 ?9 D8 q: ?& r! T. {' V# S- |      printf("%c", c); ; ]8 v0 D& `) V# x  @6 ~6 P
' o8 }& o- g# o# Z
你基础还真差,有语法错误,刚学吧,快到我网站去下教材http://neimeng.net
9 D$ m! t* e9 I" d7 mnumcmp(a,b)
: X  j3 V9 U# kchar *a,*b;
7 W5 N9 x! V) M! O{
+ p) \% w) d" @* r& sif(atoi(a)==atoi(b)) ! K( ?6 B7 j( G9 T8 @; o
return(0); ' a% d8 ^0 U( ?' h
else
: W7 U" l/ J9 E/ l% s& E' yreturn(1); : V  A4 ]9 E0 L
} 3 x8 @; l7 s$ \- z* n
改为
8 y( x0 I9 f) k) U3 Knumcmp(char *a,char *b)
4 m- H9 ]5 q' {0 Q) l{ : t; F$ S. q6 b  a! k2 ]/ W
if(atoi(*a)==atoi(*b))
( X; L6 a& l& d; D  Wreturn(0);
- j( M/ y; |4 w) @else 6 z- C& C( R8 M7 o% q
return(1);
- H( J2 f: E" k: I}
+ i" U! U1 w9 v/ T+ q' e5 i. Q' q: d$ L! N, z
在有问题就qq:1706932
6 r# r% ?) F4 l      
forlinux@263.net forlinux.yeah.net

TOP


2 O$ k- U: }% k9 T教程- ]% ~* t+ F. B9 L8 n
main()
2 w3 q6 d7 B3 x- w9 f  x     { 7 G+ ^0 n' K4 N' \: z0 G
          char c1, c2; ) H' n6 a) r8 R* j8 o
          scanf("%c", &c1);
7 h2 Y( d! i% H7 ]$ U+ {- M          scanf("%c", &c2);
/ s* I6 ?9 e8 q' f  T% J* h          printf("c1 is %c, c2 is %c", c2\1, c2); . t! I# ~+ x  y; s+ I2 N
     } ! N% s$ y  `4 J" J1 S
% T6 u3 U3 ^$ O0 ]
    运行该程序, 输入一个字符A后回车 (要完成输入必须回车), 在执行scanf 9 k0 v5 K* {6 c
("%c", &c1)时, 给变量c1赋值"A", 但回车符仍然留在缓冲区内, 执行输入语句 2 Z' s9 j( A+ g1 O* Q, _9 x6 G# d
scanf("%c", &c2)时, 变量c2输出的是一空行, 如果输入AB后回车, 那么输出结 - R$ {. p9 y) K; d
果为: c1 is A, c2 is B。 0 c6 Q0 m9 N' Z
   
1 u# f# k/ s+ K) N: M& Q其中
1 h0 M* K( n0 f# O 变量c2输出的是一空行, 如果输入AB后回车, 那么输出结
. R, [2 n, S% J+ D$ i& @/ K果为: c1 is A, c2 is B。看不明白?
& T4 _2 Z+ ?1 m% P. V# v; \: Dc2的A哪去了?
6 N) L$ @& X+ r5 a  C7 c# J4 K      

TOP

这里不方便

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

TOP

.

下面是我改的,redhat7.1下gcc编译通过
9 Q! U/ z. M5 o( i: |+ X4 L  O" s/ v命令:$ a- Y& ^( d& o3 J& }5 _
gcc bb.c -o bb( b: s) c/ J- s& ?- V4 m8 R/ c
4 A. T* D# m5 y6 F0 F( B
****************
7 _! E) ?5 K0 Y4 Z: Z  m#include <stdio.h>
9 G6 W! Q# [# y. v- ?- V  _4 p6 pmain()
; T; v( L7 ?& L! m{
& }- ]' {3 f2 l8 u      char c1, c2; # w) ~- U( `8 d- z  g
    printf("c1:");& l1 @* ?8 g/ B7 w: F# c. j" s6 ]
      scanf("%1s", &c1);
* ^8 b6 c& {# I  S, u6 z) @4 ]      printf("c2:");0 F) {6 ?! s1 f! L# H
      scanf("%1s", &c2); 1 |7 x0 J% @0 ]2 t9 |" n( ?
      printf("c1 is %c, c2 is %c", c1, c2); 5 Z: }' U$ C6 v' g
}       
forlinux@263.net forlinux.yeah.net

TOP

谢谢,我就想问
8 z6 s3 ~/ S1 ]1 a教程(在你的网站找的)2 K6 T: s5 x/ c; j! D6 `
main()
. }$ T' }1 g/ g8 ~0 A* }{
; S+ |* g* R0 E# I+ T8 F8 W4 P: R1 Zchar c1, c2;
4 y5 ]% _! \2 x$ Z( `" }- M+ a. Z8 ]scanf("%c", &c1);   b/ C$ O0 a( F
scanf("%c", &c2);
9 _- y0 D) J2 |7 }6 X5 lprintf("c1 is %c, c2 is %c", c2\1, c2); - i+ M, h7 @" `$ ?, [' r" |
}
- K2 [1 P/ U& c
# d6 J3 G8 A# T4 U, z% V运行该程序, 输入一个字符A后回车 (要完成输入必须回车), 在执行scanf 6 a7 m/ c; V9 m* O
("%c", &c1)时, 给变量c1赋值"A", 但回车符仍然留在缓冲区内, 执行输入语句
& F& t5 I& K* K  gscanf("%c", &c2)时, 变量c2输出的是一空行, 如果输入AB后回车, 那么输出结 5 z6 S* s* u5 N; h
果为: c1 is A, c2 is B。 * }1 @4 S. F& v7 m

. f7 |" F. E# w* _+ i" {: K/ D其中 0 i+ _8 s% V+ O7 Y
变量c2输出的是一空行, 如果输入AB后回车, 那么输出结
1 Z, j/ Y7 Q' ]. _7 \. n4 ~果为: c1 is A, c2 is B。看不明白? ) h9 F; N" {* l: \. ~- l+ K5 @
c2的A哪去了?
( l% N( [% z# ^/ b* }3 {* o
7 F( |' F; Z% B% h: ]就是这个关于scanf的问题,仅此而已, \) j; _/ a1 P) w0 p' y, m
      

TOP

scanf中的%c是顺序读取输入缓冲区中的内容,并且长度应该与变量的长度匹配,当你输入了A【Enter】后,输入缓冲区中有两个字符‘A’和回车键,scanf("%c",&c1)读取缓冲区中的A,而下一个scanf("%c",&c2)会顺序的读取下一个字符回车键,所以就会显示
) D! I, ~$ k5 F& d) C& d) ?" F! c" {, ?c1 is A,c2 is
( t; Q8 H1 o2 d* J      

TOP

发新话题