A. 求c語言高手:求解一個困擾我很久卻沒得解決掉問題 鏈表,字元串輸入時scanf 和 gets 之間的問題
原因是scanf和gets處理方式不同:前者是按字元讀並依次處理後放入對應的變數中,通常遇到換行符'0x0A'才結束,單不讀入這個換行符,所以這個換行符還在緩沖區中,而後者讀入時遇到換行符中止,且拋棄換行符。
所以,你那裡把scanf換成gets時由於之前(26行)的scanf還留有一個換行符,gets直接讀入了這個換行符,但name中實際為空串(長度為零),所以後面你的查詢部分沒有對長度進行判斷,同時你的鏈表最後一個指針沒有初始化(應該設置為NULL,並在遍歷時判斷這個指針作為是否鏈表結束的標志),所以導致失敗。
目前通過在gets前加一句fflush(stdin)可以清除換緩沖區,但沒有試過輸入的名字找不到時是否也出同樣的錯誤(粗看你代碼覺得應該等價),自己再檢查測試一下。
初步驗證了,在printf("beforename:");gets(name);處如果輸入的name在鏈表中找不到時也同樣報錯。所以真正的錯誤原因是指針檢查不嚴,gets只是觸發條件而已。
所以你應該加上必要的容錯處理。
下面是我測試的代碼,加上了少量的容錯後仍然會出錯。
#include<stdio.h>
#include<malloc.h>
#include<string.h>
structnode
{
charname[20];
chartel[20];
structnode*next;
};
typedefstructnodeAA;
#defineNEW(AA*)malloc(sizeof(AA))
AA*greatline(void);
voidprintline(AA*);
voidnewline(AA*,char*,char*,char*);
voiddeleteline(AA*,char*);
intmain(void)
{
AA*head;
charname[20];
charnewname[20],newtel[20];
head=greatline();
printline(head);
printf("beforename:");
gets(name);
printf("Addnewnameandnewtel:");
scanf("%s%s",newname,newtel);
newline(head,name,newname,newtel);
printline(head);
printf("inputdeletename:");
//fflush(stdin);
printf("%2X ",getchar());//相當於fflush(stdin)
gets(name); //******為什麼這里用gets(name);運 行的時候就會報錯???
//******用scanf(),就能通過,看下面截圖。
if(strlen(name)>0)//加了容錯
{
deleteline(head,name);
printline(head);
}
return0;
}
B. 請各位C語言高手幫忙解決下面的問題。
#include <stdio.h>
int binary_find(int * a, int target, int low, int high)
{
if (low > high)
{
return -1;
}
else if (a[(low + high)/2] == target)
{
return (low + high)/2;
}
else if (a[(low + high)/2] > target)
{
return binary_find(a, target, low, (low + high)/2 - 1);
}
else
{
return binary_find(a, target, (low + high)/2 + 1, high);
}
}
int main()
{
int a[15] = {0};
int i = 0;
int ret = 0;
int target = 0;
printf("請輸入15個數:\n");
for(i=0; i<15; i++)
{
scanf("%d", a+i);
}
printf("\n請輸入要查找的數:\n");
scanf("%d", &target);
ret = binary_find(a, target, 0, 14);
if(-1 != ret)
{
printf("\n%d找到了, 它是a[%d]\n", target, ret);
}
else
{
printf("\n%d沒有找到\n", target);
}
getchar();
return 0;
}
C. C語言高手解決哈!
#include<stdio.h>
float fun(float s[], int n)
{
float ave=0;
int i;
for(i=0; i<n; i++)
ave+=s[i]/n;
return ave;
}
void main()
{
float score[8], ave;
int i;
for(i=0; i<8; i++)
{printf("輸入第%d個學生的成績:\n",i+1);
scanf("%f", &score[i]);}
ave=fun(score, 8);
printf("平均成績:%.2f\n", ave);
}
D. C語言問題,請高手解決!
這段程序嚴格來說是有問題的,浮點數是不能這么比較的,這么比較對於浮點數來說是沒有意義的。浮點數的比較相等必須轉化為<=&&>=這樣的條件組合,不然產生的結果是不可預期的!主要問題來自於浮點數在寄存器中的存儲方式,還有就是我們常見的十進制和二進制在浮點表示也有差距的!
E. 跪求c語言高手
問題全在:&gmode
我沒環境,不能給你說說。
F. 請高手解決一個關於C語言的問題
拜託,這也需要C語言的問題專家或高手進?
scanf函數的一般形式
scanf(格式控制,地址表列)
int scanf(char *format[,argument,...]);
「格式控制」的含義同printf函數;「地址表列」是由若干個地址組成的表列,可以是變數的地址,或字元串首地址。
scanf()函數返回成功賦值的數據項數,出錯時則返回EOF。
例題 scanf函數輸入數據。
#include<stdio.h>
void main(){
int a,b,c;
printf("input a,b,c\n");
scanf("%d%d%d",&a,&b,&c);
printf("a=%d,b=%d,c=%d",a,b,c);
}
[編輯本段]格式字元 說明
%a 讀入一個浮點值(僅C99有效)
%A 同上
%c 讀入一個字元
%d 讀入十進制整數
%i 讀入十進制,八進制,十六進制整數
%o 讀入八進制整數
%x 讀入十六進制整數
%X 同上
%c 讀入一個字元
%s 讀入一個字元串,遇空格、製表符或換行符結束。
%f 用來輸入實數,可以用小數形式或指數形式輸入。
%F 同上
%e 同上
%E 同上
%g 同上
%G 同上
%p 讀入一個指針
%u 讀入一個無符號十進制整數
%n 至此已讀入值的等價字元數
%[] 掃描字元集合
%% 讀%符號
附加格式說明字元表修飾符 說明L/l 長度修飾符 輸入"長"數據
h 長度修飾符 輸入"短"數據
W 整型常數 指定輸入數據所佔寬度
m指定輸入數據所佔的寬度
* 星號 空讀一個數據
hh,ll同上h,l但僅對C99有效。
(B) 空白字元空白字元會使scanf()函數在讀操作中略去輸入中的一個或多個空白字元,空白符可以是space,tab,newline等等,直到第一個非空白符出現為止。(C) 非空白字元一個非空白字元會使scanf()函數在讀入時剔除掉與這個非空白字元相同的字元。
註:scanf()控制串知識就介紹到這里(應該比較齊全了^_^),如有遺漏下次補上。下面將結合實際常式,一一闡述.三、 scanf()函數的控制串的使用例1.#include "stdio.h"
int main(void)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
printf("%d,%d,%d\n",a,b,c);return 0;
} 運行時按如下方式輸入三個值:3□4□5 ↙(輸入a,b,c的值)3,4,5 (printf輸出的a,b,c的值) (1) &a、&b、&c中的&是地址運算符,分別獲得這三個變數的內存地址。
(2) "%d%d%d"是按十進值格式輸入三個數值。輸入時,在兩個數據之間可以用一個或多個空格、tab鍵、回車鍵分隔。
以下是合法輸入方式:
① 3□□4□□□□5↙
② 3↙
4□5↙
③ 3(tab鍵)4↙
5↙
例2.#include "stdio.h"
int main(void)
{
int a,b,c;scanf("%d,%d,%d",&a,&b,&c);
printf("%d,%d,%d\n",a,b,c);return 0;
} 運行時按如下方式輸入三個值:3,4,5 ↙(輸入a,b,c的值)或者3,□4,□5 ↙(輸入a,b,c的值)3,□□□4,□5 ↙(輸入a,b,c的值)
......
都是合法的,但是","一定要跟在數字後面,如:
3□,4,□5 ↙就非法了,程序出錯。(解決方法與原因後面講)再如:1、sacnf()中的變數必須使用地址。 int a, b;
scanf("%d%d",a,b); //錯誤
scanf("%d%d",&a,&b);2、scanf()的格式控制串可以使用其它非空白字元,但在輸入時必須輸入這些字元。例:
scanf("%d,%d",&a,&b);
輸入: 3,4 ↙(逗號與"%d,%d"中的逗號對應)
scanf("a=%d,b=%d",&a,&b);
輸入: a=3,b=4 ↙("a=","b=",逗號與"%d,%d"中的"a=","b="及逗號對應)
3、在用"%c"輸入時,空格和「轉義字元」均作為有效字元。例:
scanf("%c%c%c",&c1,&c2,&c3);
輸入:a□b□c↙
結果:a→c1,□→c2,b→c3 (其餘被丟棄)
scanf()函數接收輸入數據時,遇以下情況結束一個數據的輸入:(不是結束該scanf函數,scanf函數僅在每一個數據域均有數據,並按回車後結束)。
① 遇空格、「回車」、「跳格」鍵。
② 遇寬度結束。
③ 遇非法輸入。問題二:scanf()函數不能正確接受有空格的字元串?如: I love you!
#include <stdio.h>
int main()
{
char str[80];
scanf("%s",str);
printf("%s",str); return 0;
}輸入:I live you!
輸出:I scanf()函數接收輸入數據時,遇以下情況結束一個數據的輸入:(不是結束該scanf函數,scanf函數僅在每一個數據域均有數據,並按回車後結束)。
① 遇空格、「回車」、「跳格」鍵。
② 遇寬度結束。
③ 遇非法輸入。所以,上述程序並不能達到預期目的,scanf()掃描到"I"後面的空格就認為對str的賦值結束,並忽略後面的"love you!".這里要注意是"love you!"還在鍵盤緩沖區(關於這個問題,網上我所見的說法都是如此,但是,我經過調試發現,其實這時緩沖區字元串首尾指針已經相等了,也就是說緩沖區清空了,scanf()函數應該只是掃描stdin流,這個殘存信息是在stdin中)。我們改動一下上面的程序來驗證一下:#include <stdio.h>
int main()
{
char str[80];
char str1[80];
char str2[80];
scanf("%s",str);/*此處輸入:I love you! */
printf("%s",str);
sleep(5);/*這里等待5秒,告訴你程序運行到什麼地方*/
scanf("%s",str1);/*這兩句無需你再輸入,是對鍵盤盤緩沖區再掃描 */
scanf("%s",str2);/*這兩句無需你再輸入,是對鍵盤盤緩沖區再掃描 */
printf("\n%s",str1);
printf("\n%s",str2);
return 0;
}輸入:I love you!
輸出:I
love
you!好了,原因知道了,那麼scanf()函數能不能完成這個任務?回答是:能!別忘了scanf()函數還有一個 %[] 格式控制符(如果對%[]不了解的請查看本文的上篇),請看下面的程序:#include "stdio.h"
int main()
{
char string[50];
/*scanf("%s",string);不能接收空格符*/
scanf("%[^\n]",string);
printf("%s\n",string);
return 0;
}問題三:鍵盤緩沖區殘余信息問題
#include <stdio.h>
int main()
{
int a;
char c; do
{
scanf("%d",&a);
scanf("%c",&c);
printf("a=%d c=%c\n",a,c);
/*printf("c=%d\n",c);*/
}while(c!='N');
} scanf("%c",&c);這句不能正常接收字元,什麼原因呢?我們用printf("c=%d\n",c);將C用int表示出來,啟用printf("c=%d\n",c);這一句,看看scanf()函數賦給C到底是什麼,結果是 c=10 ,ASCII值為10是什麼?換行即\n.對了,我們每擊打一下"Enter"鍵,向鍵盤緩沖區發去一個「回車」(\r),一個「換行"(\n),在這里\r被scanf()函數處理掉了(姑且這么認為吧^_^),而\n被scanf()函數「錯誤」地賦給了c.解決辦法:可以在兩個scanf()函數之後加個fflush(stdin);,還有加getch(); getchar();也可以,但是要視具體scanf()語句加那個,這里就不分析了,讀者自己去摸索吧。但是加fflush(stdin);不管什麼情況都可行。函數名: fflush
功 能: 清除一個流
用 法: int fflush(FILE *stream);#include <stdio.h>
int main()
{
int a;
char c; do
{
scanf("%d",&a);
fflush(stdin);
scanf("%c",&c);
fflush(stdin);
printf("a=%d c=%c\n",a,c); }while(c!='N');
} 這里再給一個用「空格符」來處理緩沖區殘余信息的示例:運行出錯的程序:#include <stdio.h>
int main()
{
int i;
char j;
for(i = 0;i < 10;i++)
{
scanf("%c",&j);/*這里%前沒有空格*/
}
}使用了空格控制符後:#include <stdio.h>
int main()
{
int i;
char j;
for(i = 0;i < 10;i++)
{
scanf(" %c",&j);/*注意這里%前有個空格*/
}
} 可以運行看看兩個程序有什麼不同。問題四 如何處理scanf()函數誤輸入造成程序死鎖或出錯?#include <stdio.h>
int main()
{
int a,b,c; /*計算a+b*/scanf("%d,%d",&a,&b);
c=a+b;
printf("%d+%d=%d",a,b,c);
}如上程序,如果正確輸入a,b的值,那麼沒什麼問題,但是,你不能保證使用者每一次都能正確輸入,一旦輸入了錯誤的類型,你的程序不是死鎖,就是得到一個錯誤的結果,呵呵,這可能所有人都遇到過的問題吧?解決方法:scanf()函數執行成功時的返回值是成功讀取的變數數,也就是說,你這個scanf()函數有幾個變數,如果scanf()函數全部正常讀取,它就返回幾。但這里還要注意另一個問題,如果輸入了非法數據,鍵盤緩沖區就可能還個有殘余信息問題。正確的常式:#include <stdio.h>
int main()
{
int a,b,c; /*計算a+b*/while(scanf("%d,%d",&a,&b)!=2)fflush(stdin);
c=a+b;
printf("%d+%d=%d",a,b,c);
G. C語言編程問題,求高手解決!111
已經改好,具體請看注釋:
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
void main()
{
int *p=NULL,n,i,j,k,max,min;//這里!這里!這里!這里!這里!此時p還沒有動態分配內存,不能進行p[0]的訪問
printf("請輸入數組元素的個數:");
scanf("%d",&n);
p=(int*)malloc(n*sizeof(int)); /*向內存申請數組的內存空間*/
if(p==NULL)
{
printf("沒有足夠的內存空間");
exit(0);
}
printf("請輸入數組元素的初始值:");
for(i=0;i<n;i++)
scanf("%d",p+i);
max=p[0];//這里!這里!這里!這里!這里!這個時候進行max,min的賦值比較合適
min=p[0];
for (j=1;j<n;j++)
{
max=max>p[j]?max:p[j];
min=min<p[j]?min:p[j];
}
for(k=0;k<n;k++)
{
if(max==p[k])
printf("此數組中第%d個數最大為: %d\n",k+1,max);//這里!這里!這里!這里!這里!是%d\n,不是d\n
if(min==p[k])
printf("此數組中第%d個數最小為: %d\n",k+1,min);
}
}
H. c語言難題 請高手進來幫忙解決 在線等
#include <stdio.h>
int main()
{
char sex,sports,diet;
double faHeight,moHeight,yourHeight;
printf("輸入你的性別(F女/M男):");
scanf("%c",&sex);
getchar();
printf("輸入你父親的身高(cm):");
scanf("%lf",&faHeight);
getchar();
printf("輸入你母親的身高(cm):");
scanf("%lf",&moHeight);
getchar();
printf("你喜愛體育運動嗎?(y/n)");
scanf("%c",&sports);
getchar();
printf("你有有良好的飲食習慣嗎?(y/n)");
scanf("%c",&diet);
getchar();
if (sex=='F')
yourHeight=(faHeight*0.923 + moHeight) / 2;
else if (sex=='M')
yourHeight=(faHeight + moHeight)*0.54;
else printf("性別錯誤\n");
if (sports=='y') yourHeight=yourHeight*1.02;
if (diet=='y') yourHeight=yourHeight*1.015;
printf("你的身高為:%lfcm",yourHeight);
return 0;
}
你把程序改成這樣就可以了!就是double和float的類型轉換!