关于在VS2017中使用C语言用system("title 标题")会导致窗体标题栏乱码

图片说明
我在VS2017中使用C语言编程时,想给窗体换个标题,于是调用了system("title 标题")这个函数,但是运行时标题栏变成了乱码,经过几次尝试发现只有用中文标题才会这样,如果用英文就显示正常。望各位大佬能帮忙告诉我问题所在和解决方法,谢谢

1个回答

windows的API是分ASCII和UNICODE两个版本的,VS新建项目时候默认使用UNICODE的API,但这个双引号表示ASCII字符串,所以需要用_T或L或TEXT宏转换为UNICODE字符串

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
求!!!!怎么在C语言添加背景音乐
我打算在个C语言程序中加背景音乐,找了好多都不行,总会报错,希望有大佬可以教我一下怎么加背景音乐,用的是DV源代码如下(拜托了各位大佬!!!) #include <stdio.h> #include <windows.h> #include <time.h> #include <conio.h> #include <stdlib.h> #define N 65 int status[N][N]={{0},{0}};//记录棋盘情况,0无,1红棋/玩家,2为白棋/电脑 int flag=0;//判断输赢 int direct[2];//方向 int Value1[N][N]={{0},{0}};//计算权值 int Value2[N][N]={{0},{0}};//计算权值 int regrex,regrey,regrex1,regrey1; int count=0;//计算棋子数量 void chess_board();//打印棋盘 void red_movexy();//红子棋移动光标 void white_movexy();//白棋移动光标 void red_chess(int x,int y);//红棋 void white_chess(int x,int y);//白棋 void man_machine();//人机对战 int judge_chess(int x,int y);//判断这个位置是否下过 int judge_winner(int x,int y,int temp);//判断输赢 void machine_attack();//电脑进攻权值 void machine_defend();//电脑防守权值 void find_position();//寻找最佳权值 void Regret();//悔棋函数 void BackGround(unsigned int ForeColor, unsigned int BackGroundColor) //颜色 { HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); //获取控制台的句柄 SetConsoleTextAttribute(handle, ForeColor + BackGroundColor * 0x10);//改变当前光标的背景和字体颜色 } void gotoxy(int x, int y) //光标函数 { HANDLE handle; COORD coord; //获取坐标轴结构体 coord.X = x; coord.Y = y; handle = GetStdHandle(STD_OUTPUT_HANDLE); //获取控制台句柄,值为-11 SetConsoleCursorPosition(handle, coord); //移动光标到x,y处 } void chess_board()//打印棋盘 { int i,j; for(i=0;i<=30;i++) for(j=0;j<=60;j+=4) { gotoxy(j,i); printf("|"); } for(i=0;i<=30;i+=2) for(j=1;j<=57;j+=4) { gotoxy(j,i); printf("---"); } } void chess_menu()//打印棋盘旁的菜单 { int i,j; for(i=1;i<=29;i++) { gotoxy(67,i); printf("||"); } for(i=1;i<=29;i++) { gotoxy(89,i); printf("||"); } gotoxy(69,1); printf("--------------------"); gotoxy(69,29); printf("--------------------"); gotoxy(75,3); printf("模 式"); gotoxy(73,9); printf("WASD移动光标"); gotoxy(73,10); printf("选择下棋位置"); gotoxy(73,11); printf("按空格键确认"); gotoxy(73,12); printf("按Q悔棋"); gotoxy(73,20); printf("提 示"); } void red_movexy()//红棋移动光标 { loop2:gotoxy(direct[0],direct[1]); char key='y'; int temp; while(key!=' ') { key=getch(); switch(key) { case 'W': case 'w': direct[1]-=2; if(direct[1]<=1) direct[1]=1; break; case 's': case 'S': direct[1]+=2; if(direct[1]>=29) direct[1]=29; break; case 'a': case 'A': direct[0]-=4; if(direct[0]<=2) direct[0]=2; break; case 'd': case 'D': direct[0]+=4; if(direct[0]>=58) direct[0]=58; break; case 'q': case 'Q': { int message=MessageBox(NULL,"是否确定悔棋?","友情提示",MB_OKCANCEL); if(IDCANCEL==message) break; if(IDOK==message) { Regret(); break; } } } gotoxy(direct[0],direct[1]); } temp=judge_chess(direct[1],direct[0]); if(temp==1) { gotoxy(70,22); BackGround(4, 0); printf("这里已经被人下过了"); goto loop2; } } void white_movexy()//白棋移动光标 { loop1:gotoxy(direct[0],direct[1]); char key='y'; int temp; while(key!='0') { key=getch(); switch(key) { case 72: direct[1]-=2; if(direct[1]<=1) direct[1]=1; break; case 80: direct[1]+=2; if(direct[1]>=29) direct[1]=29; break; case 75: direct[0]-=4; if(direct[0]<=2) direct[0]=2; break; case 77: direct[0]+=4; if(direct[0]>=58) direct[0]=58; break; case 'B': case 'b': { int message=MessageBox(NULL,"是否确定悔棋?","友情提示",MB_OKCANCEL); if(IDCANCEL==message) break; if(IDOK==message) { Regret(); break; } } } gotoxy(direct[0],direct[1]); } temp=judge_chess(direct[1],direct[0]); if(temp==1) { gotoxy(70,22); BackGround(4, 0); printf("这里已经被人下过了"); goto loop1; } } void red_chess(int x,int y)//打印红棋 { BackGround(4,0); regrex=x;//记录上一落子的位置 ,方便悔棋 regrey=y; count++; printf("●"); status[x][y]=1; } void white_chess(int x,int y)//打印白棋 { BackGround(7,0); regrex1=x; regrey1=y; printf("●"); count++; status[x][y]=2; } void machine_chess(int x,int y)//电脑落子 { BackGround(7,0); status[x][y]=2; regrex1=x; regrey1=y; count++; gotoxy(y,x); printf("●"); } int judge_chess(int x,int y)//判断这个地方是否有棋子 { if(status[x][y]==0) return 0; else return 1; } int judge_winner(int x,int y,int temp)//判断输赢 { int i,j,n1,n2; n1=n2=0; for(i=x,j=y+4;j<=58;j+=4)//右 { if(status[i][j]==temp) n1++; else break; } for(i=x,j=y;j>=2;j-=4)//左 { if(status[i][j]==temp) n2++; else break; } if(n1+n2>=5) return temp; n1=n2=0; for(i=x,j=y;i>=1;i-=2)//上 { if(status[i][j]==temp) n1++; else break; } for(i=x+2,j=y;i<=30;i+=2)//下 { if(status[i][j]==temp) n2++; else break; } if(n1+n2>=5) return temp; n1=n2=0; for(i=x-2,j=y+4;i>=1&&j<=58;i-=2,j+=4)//右上 { if(status[i][j]==temp) n1++; else break; } for(i=x,j=y;i<=30&&j>=2;i+=2,j-=4)//左下 { if(status[i][j]==temp) n2++; else break; } if(n1+n2>=5) return temp; n1=n2=0; for(i=x,j=y;i>=0&&j>=0;i-=2,j-=4)//左上 { if(status[i][j]==temp) n1++; else break; } for(i=x+2,j=y+4;i<=30&&j<=58;i+=2,j+=4)//右下 { if(status[i][j]==temp) n2++; else break; } if(n1+n2>=5) return temp; return 0; } void machine_attack()//电脑进攻权值 { int i1,j1; int k1,k2,k; for(int i=1;i<=30;i+=2) { for(int j=2;j<=58;j+=4) { if(status[i][j]) Value1[i][j]=0; if(status[i][j]==0) { k1=k2=0; for(i1=i,j1=j-4;j1>=2;j1-=4)//往左数寻找电脑棋子数 { if(status[i1][j1]==2) k1++; else break; } for(i1=i,j1=j+4;j1<=58;j1+=4)//往右数寻找电脑棋子数 { if(status[i1][j1]==2) k2++; else break; } k=k1>k2? k1:k2; k1=k2=0; for(i1=i-2,j1=j;i1>=1;i1-=2)//往上数寻找电脑棋子数 { if(status[i1][j1]==2) k1++; else break; } for(i1=i+2,j1=j;i1<=30;i1+=2)//往下数寻找电脑棋子数 { if(status[i1][j1]==2) k2++; else break; } k1=k1>k2? k1:k2; k=k>k1? k:k1; k1=k2=0; for(i1=i-2,j1=j-4;i1>=0&&j1>=0;i1-=2,j1-=4)//往左上数寻找电脑棋子数 { if(status[i1][j1]==2) k1++; else break; } for(i1=i+2,j1=j+4;i1<=30&&j1<=58;i1+=2,j1+=4)//往右下数寻找电脑棋子数 { if(status[i1][j1]==2 ) k2++; else break; } k1=k1>k2? k1:k2; k=k>k1?k:k1; k1=k2=0; for(i1=i+2,j1=j-4;i1<=30&&j1>=2;i1+=2,j1-=4)//往左下数寻找电脑棋子数 { if(status[i1][j1]==2) k1++; else break; } for(i1=i-2,j1=j+4;i1>=1&&j1<=58;i1-=2,j1+=4)//往右上数寻找电脑棋子数 { if(status[i1][j1]==2) k2++; else break; } k1=k1>k2? k1:k2; k=k>k1?k:k1; switch(k) { case 3: Value1[i][j]=15;break; case 4: Value1[i][j]=25;break; default: Value1[i][j]=3+2*k;break; } } } } } void machine_defend()//防守权值 { int i1, j1; int k1,k2,k; for(int i=1;i<=30;i+=2) { for(int j=2;j<=58;j+=4) { if(status[i][j]) Value2[i][j]=0; if(status[i][j]==0) { k1=k2=0; for(i1=i,j1=j-4;j1>=2;j1-=4)//往左数寻找玩家棋子数 { if(status[i1][j1]==1) k1++; else break; } for(i1=i,j1=j+4;j1<=58;j1+=4)//往右数寻找玩家棋子数 { if(status[i1][j1]==1) k2++; else break; } k=k1>k2? k1:k2; k1=k2=0; for(i1=i-2,j1=j;i1>=1;i1-=2)//往上数寻找玩家棋子数 { if(status[i1][j1]==1) k1++; else break; } for(i1=i+2,j1=j;i1<=30;i1+=2)//往下数寻找玩家棋子数 { if(status[i1][j1]==1) k2++; else break; } k1=k1>k2? k1:k2; k=k>k1?k:k1; k1=k2=0; for(i1=i-2,j1=j-4;i1>=1&&j1>=2;i1-=2,j1-=4)//往左上数寻找玩家棋子数 { if(status[i1][j1]==1) k1++; else break; } for(i1=i+2,j1=j+4;i1<=30&&j1<=58;i1+=2,j1+=4)//往右下数寻找玩家棋子数 { if(status[i1][j1]==1) k2++; else break; } k1=k1>k2? k1:k2; k=k>k1?k:k1; k1=k2=0; for(i1=i+2,j1=j-4;i1<=30&&j1>=2;i1+=2,j1-=4)//往左下数寻找玩家棋子数 { if(status[i1][j1]==1) k1++; else break; } for(i1=i-2,j1=j+4;i1>=1&&j1<=58;i1-=2,j1+=4)//往右上数寻找玩家棋子数 { if(status[i1][j1]==1) k2++; else break; } k1=k1>k2? k1:k2; k=k>k1?k:k1; switch(k) { case 3: Value2[i][j]=10;break; case 4: Value2[i][j]=20;break; default: Value2[i][j]=2+k*2; } } } } } void find_position()//找到最有价值的位置 { int k1=0, k2=0; int i, j, max=0; for( i=1;i<=30;i+=2) for( j=2;j<=58;j+=4) { if(max<=Value1[i][j]) { max=Value1[i][j]; k1=i; k2=j; } } for( i=1;i<=30;i+=2) for( j=2;j<=58;j+=4) { if(max<=Value2[i][j]) { max=Value2[i][j]; k1=i; k2=j; } } direct[1]=k1; //将找到的位置传给光标 direct[0]=k2; } void man_machine()//人机对战模式 { loop6:system("cls"); char key; int control; gotoxy(2, 3); printf("1.玩 家 先 手(玩家为红子)"); gotoxy(2, 5); printf("2.电 脑 先 手(电脑为白子)"); gotoxy(2, 7); printf("(输入相应序号选择)"); key=getch(); system("cls"); if(key=='1') control=1; else if(key=='2') { control=1; machine_chess(13,26); } else goto loop6; gotoxy(70,5); printf(" 人 机 对 战 "); direct[1]=15; direct[0]=30; chess_board(); chess_menu(); while(flag==0) { if(control==1) { gotoxy(70,22); BackGround(6,0); printf(" 玩 家 执 手 "); red_movexy(); red_chess(direct[1],direct[0]); flag=judge_winner(direct[1],direct[0],1); } else { gotoxy(70,22); BackGround(6,0); printf(" 电 脑 执 手 "); machine_defend(); machine_attack(); find_position(); machine_chess(direct[1],direct[0]); flag=judge_winner(direct[1],direct[0],2); } control=-control; } gotoxy(8,18); if(flag==1) { BackGround(7,0); MessageBox(NULL,"太厉害了,您竟然战胜了电脑!","五子棋游戏",MB_OK); } if(flag==2) { MessageBox(NULL,"游戏结束,您输给了电脑","五子棋游戏",MB_OK); } if(count>=225) { MessageBox(NULL,"平局","五子棋游戏",MB_OK); } } void Regret()//悔棋函数 { gotoxy(regrey,regrex); BackGround(0,0); printf(" "); status[regrex][regrey]=0; gotoxy(regrey1,regrex1); BackGround(0,0); printf(" "); status[regrex1][regrey1]=0; count-=2; } void welcome()//游戏菜单 { int k; char choose; system("cls"); for(k=2;k<=12;k+=2)//游戏菜单 { gotoxy(5,k); printf("|-----------------|"); } gotoxy(5, 3); printf("| 五 子 棋 游 戏 |"); gotoxy(5, 5); printf("| 菜 单 |"); gotoxy(5, 7); printf("| 1.人 机 对 战 |"); gotoxy(5, 9); printf("| 2.最 高 纪 录 |"); gotoxy(5, 11); printf("| 3.退 出 游 戏 |"); gotoxy(5, 16); printf("温馨提示:输入菜单对应序号进行操作"); gotoxy(5, 18); printf("祝您游戏愉快!"); gotoxy(13, 20); } char Updatediary()//最高纪录 { system("cls"); gotoxy(2, 3); printf("(暂时没有)"); gotoxy(2, 5); printf("(按E键返回,按其它任意键退出)"); return getch(); } int main() { system("title 五子棋"); system("mode con cols=92 lines=33"); char choose,temp; loop:welcome(); choose=getch(); switch(choose) { case '1': man_machine(); break; case '2': temp=Updatediary(); if(temp=='E'||temp=='e') goto loop; break; case '3': int message=MessageBox(NULL,"是否退出?","友情提示",MB_OKCANCEL); if(IDCANCEL==message) goto loop; if(IDOK==message) { break; } } } ``` ```
求助改写一个c语言程序
我的编译环境是vs2013,我有一个五子棋代码,想要改一下棋盘和落子方式。但每次改动都会报错,求大佬帮我改成要求的形式,要求棋盘如下 ![图片说明](https://img-ask.csdn.net/upload/201912/21/1576915117_449851.png)棋盘的输入只能以键盘输入,建议统一以字母为先,如G2.且棋子必须下在棋盘格的交点上,不可下在格子里。 ``` #include <stdio.h> #include <windows.h> #include <time.h> #include <conio.h> #include <stdlib.h> #define N 65 int status[N][N] = { { 0 }, { 0 } };//记录棋盘情况,0无,1红棋/玩家,2为白棋/电脑 int flag = 0;//判断输赢 int direct[2];//方向 int Value1[N][N] = { { 0 }, { 0 } };//计算权值 int Value2[N][N] = { { 0 }, { 0 } };//计算权值 int regrex, regrey, regrex1, regrey1; int count = 0;//计算棋子数量 void chess_board();//打印棋盘 void red_movexy();//红子棋移动光标 void white_movexy();//白棋移动光标 void red_chess(int x, int y);//红棋 void white_chess(int x, int y);//白棋 void man_man(); void man_machine();//人机对战 int judge_chess(int x, int y);//判断这个位置是否下过 int judge_winner(int x, int y, int temp);//判断输赢 void machine_attack();//电脑进攻权值 void machine_defend();//电脑防守权值 void find_position();//寻找最佳权值 void Regret();//悔棋函数 void BackGround(unsigned int ForeColor, unsigned int BackGroundColor) //颜色 { HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); //获取控制台的句柄 SetConsoleTextAttribute(handle, ForeColor + BackGroundColor * 0x10);//改变当前光标的背景和字体颜色 } void gotoxy(int x, int y) //光标函数 { HANDLE handle; COORD coord; //获取坐标轴结构体 coord.X = x; coord.Y = y; handle = GetStdHandle(STD_OUTPUT_HANDLE); //获取控制台句柄,值为-11 SetConsoleCursorPosition(handle, coord); //移动光标到x,y处 } void chess_board()//打印棋盘 { int i, j; for (i = 0; i <= 30; i++) for (j = 0; j <= 60; j += 4) { gotoxy(j, i); printf("|"); } for (i = 0; i <= 30; i += 2) for (j = 1; j <= 57; j += 4) { gotoxy(j, i); printf("---"); } } void chess_menu()//打印棋盘旁的菜单 { int i, j; for (i = 1; i <= 29; i++) { gotoxy(67, i); printf("||"); } for (i = 1; i <= 29; i++) { gotoxy(89, i); printf("||"); } gotoxy(69, 1); printf("--------------------"); gotoxy(69, 29); printf("--------------------"); gotoxy(75, 3); printf("模 式"); gotoxy(75, 20); printf("提 示"); } void red_movexy()//红棋移动光标 { loop2: gotoxy(direct[0], direct[1]); char key = 'y'; int temp; while (key != ' ') { key = _getch(); switch (key) { case 'W': case 'w': direct[1] -= 2; if (direct[1] <= 1) direct[1] = 1; break; case 's': case 'S': direct[1] += 2; if (direct[1] >= 29) direct[1] = 29; break; case 'a': case 'A': direct[0] -= 4; if (direct[0] <= 2) direct[0] = 2; break; case 'd': case 'D': direct[0] += 4; if (direct[0] >= 58) direct[0] = 58; break; case 'q': case 'Q': { int message = MessageBox(NULL, "是否确定悔棋?", "友情提示", MB_OKCANCEL); if (IDCANCEL == message) break; if (IDOK == message) { Regret(); break; } } } gotoxy(direct[0], direct[1]); } temp = judge_chess(direct[1], direct[0]); if (temp == 1) { gotoxy(70, 22); BackGround(4, 0); printf("这里已经被人下过了"); goto loop2; } } void white_movexy()//白棋移动光标 { loop1:gotoxy(direct[0], direct[1]); char key = 'y'; int temp; while (key != '0') { key = _getch(); switch (key) { case 72: direct[1] -= 2; if (direct[1] <= 1) direct[1] = 1; break; case 80: direct[1] += 2; if (direct[1] >= 29) direct[1] = 29; break; case 75: direct[0] -= 4; if (direct[0] <= 2) direct[0] = 2; break; case 77: direct[0] += 4; if (direct[0] >= 58) direct[0] = 58; break; case 'B': case 'b': { int message = MessageBox(NULL, "是否确定悔棋?", "友情提示", MB_OKCANCEL); if (IDCANCEL == message) break; if (IDOK == message) { Regret(); break; } } } gotoxy(direct[0], direct[1]); } temp = judge_chess(direct[1], direct[0]); if (temp == 1) { gotoxy(70, 22); BackGround(4, 0); printf("这里已经被人下过了"); goto loop1; } } void red_chess(int x, int y)//打印红棋 { BackGround(4, 0); regrex = x;//记录上一落子的位置 ,方便悔棋 regrey = y; count++; printf("●"); status[x][y] = 1; } void white_chess(int x, int y)//打印白棋 { BackGround(7, 0); regrex1 = x; regrey1 = y; printf("●"); count++; status[x][y] = 2; } void machine_chess(int x, int y)//电脑落子 { BackGround(7, 0); status[x][y] = 2; regrex1 = x; regrey1 = y; count++; gotoxy(y, x); printf("●"); } int judge_chess(int x, int y)//判断这个地方是否有棋子 { if (status[x][y] == 0) return 0; else return 1; } int judge_winner(int x, int y, int temp)//判断输赢 { int i, j, n1, n2; n1 = n2 = 0; for (i = x, j = y + 4; j <= 58; j += 4)//右 { if (status[i][j] == temp) n1++; else break; } for (i = x, j = y; j >= 2; j -= 4)//左 { if (status[i][j] == temp) n2++; else break; } if (n1 + n2 >= 5) return temp; n1 = n2 = 0; for (i = x, j = y; i >= 1; i -= 2)//上 { if (status[i][j] == temp) n1++; else break; } for (i = x + 2, j = y; i <= 30; i += 2)//下 { if (status[i][j] == temp) n2++; else break; } if (n1 + n2 >= 5) return temp; n1 = n2 = 0; for (i = x - 2, j = y + 4; i >= 1 && j <= 58; i -= 2, j += 4)//右上 { if (status[i][j] == temp) n1++; else break; } for (i = x, j = y; i <= 30 && j >= 2; i += 2, j -= 4)//左下 { if (status[i][j] == temp) n2++; else break; } if (n1 + n2 >= 5) return temp; n1 = n2 = 0; for (i = x, j = y; i >= 0 && j >= 0; i -= 2, j -= 4)//左上 { if (status[i][j] == temp) n1++; else break; } for (i = x + 2, j = y + 4; i <= 30 && j <= 58; i += 2, j += 4)//右下 { if (status[i][j] == temp) n2++; else break; } if (n1 + n2 >= 5) return temp; return 0; } void machine_attack()//电脑进攻权值 { int i1, j1; int k1, k2, k; int i, j; for (i = 1; i <= 30; i += 2) { for (j = 2; j <= 58; j += 4) { if (status[i][j]) Value1[i][j] = 0; if (status[i][j] == 0) { k1 = k2 = 0; for (i1 = i, j1 = j - 4; j1 >= 2; j1 -= 4)//往左数寻找电脑棋子数 { if (status[i1][j1] == 2) k1++; else break; } for (i1 = i, j1 = j + 4; j1 <= 58; j1 += 4)//往右数寻找电脑棋子数 { if (status[i1][j1] == 2) k2++; else break; } k = k1>k2 ? k1 : k2; k1 = k2 = 0; for (i1 = i - 2, j1 = j; i1 >= 1; i1 -= 2)//往上数寻找电脑棋子数 { if (status[i1][j1] == 2) k1++; else break; } for (i1 = i + 2, j1 = j; i1 <= 30; i1 += 2)//往下数寻找电脑棋子数 { if (status[i1][j1] == 2) k2++; else break; } k1 = k1>k2 ? k1 : k2; k = k>k1 ? k : k1; k1 = k2 = 0; for (i1 = i - 2, j1 = j - 4; i1 >= 0 && j1 >= 0; i1 -= 2, j1 -= 4)//往左上数寻找电脑棋子数 { if (status[i1][j1] == 2) k1++; else break; } for (i1 = i + 2, j1 = j + 4; i1 <= 30 && j1 <= 58; i1 += 2, j1 += 4)//往右下数寻找电脑棋子数 { if (status[i1][j1] == 2) k2++; else break; } k1 = k1>k2 ? k1 : k2; k = k>k1 ? k : k1; k1 = k2 = 0; for (i1 = i + 2, j1 = j - 4; i1 <= 30 && j1 >= 2; i1 += 2, j1 -= 4)//往左下数寻找电脑棋子数 { if (status[i1][j1] == 2) k1++; else break; } for (i1 = i - 2, j1 = j + 4; i1 >= 1 && j1 <= 58; i1 -= 2, j1 += 4)//往右上数寻找电脑棋子数 { if (status[i1][j1] == 2) k2++; else break; } k1 = k1>k2 ? k1 : k2; k = k>k1 ? k : k1; switch (k) { case 3: Value1[i][j] = 15; break; case 4: Value1[i][j] = 25; break; default: Value1[i][j] = 3 + 2 * k; break; } } } } } void machine_defend()//防守权值 { int i1, j1; int k1, k2, k; int i, j; for (i = 1; i <= 30; i += 2) { for (j = 2; j <= 58; j += 4) { if (status[i][j]) Value2[i][j] = 0; if (status[i][j] == 0) { k1 = k2 = 0; for (i1 = i, j1 = j - 4; j1 >= 2; j1 -= 4)//往左数寻找玩家棋子数 { if (status[i1][j1] == 1) k1++; else break; } for (i1 = i, j1 = j + 4; j1 <= 58; j1 += 4)//往右数寻找玩家棋子数 { if (status[i1][j1] == 1) k2++; else break; } k = k1>k2 ? k1 : k2; k1 = k2 = 0; for (i1 = i - 2, j1 = j; i1 >= 1; i1 -= 2)//往上数寻找玩家棋子数 { if (status[i1][j1] == 1) k1++; else break; } for (i1 = i + 2, j1 = j; i1 <= 30; i1 += 2)//往下数寻找玩家棋子数 { if (status[i1][j1] == 1) k2++; else break; } k1 = k1>k2 ? k1 : k2; k = k>k1 ? k : k1; k1 = k2 = 0; for (i1 = i - 2, j1 = j - 4; i1 >= 1 && j1 >= 2; i1 -= 2, j1 -= 4)//往左上数寻找玩家棋子数 { if (status[i1][j1] == 1) k1++; else break; } for (i1 = i + 2, j1 = j + 4; i1 <= 30 && j1 <= 58; i1 += 2, j1 += 4)//往右下数寻找玩家棋子数 { if (status[i1][j1] == 1) k2++; else break; } k1 = k1>k2 ? k1 : k2; k = k>k1 ? k : k1; k1 = k2 = 0; for (i1 = i + 2, j1 = j - 4; i1 <= 30 && j1 >= 2; i1 += 2, j1 -= 4)//往左下数寻找玩家棋子数 { if (status[i1][j1] == 1) k1++; else break; } for (i1 = i - 2, j1 = j + 4; i1 >= 1 && j1 <= 58; i1 -= 2, j1 += 4)//往右上数寻找玩家棋子数 { if (status[i1][j1] == 1) k2++; else break; } k1 = k1>k2 ? k1 : k2; k = k>k1 ? k : k1; switch (k) { case 3: Value2[i][j] = 10; break; case 4: Value2[i][j] = 20; break; default: Value2[i][j] = 2 + k * 2; } } } } } void find_position()//找到最有价值的位置 { int k1 = 0, k2 = 0; int i, j, max = 0; for (i = 1; i <= 30; i += 2) for (j = 2; j <= 58; j += 4) { if (max <= Value1[i][j]) { max = Value1[i][j]; k1 = i; k2 = j; } } for (i = 1; i <= 30; i += 2) for (j = 2; j <= 58; j += 4) { if (max <= Value2[i][j]) { max = Value2[i][j]; k1 = i; k2 = j; } } direct[1] = k1; //将找到的位置传给光标 direct[0] = k2; } void man_man()//人人对战模式 { loop5:system("cls"); char key; int control; gotoxy(2, 3); printf("1.红 子 先 手"); gotoxy(2, 5); printf("2.白 子 先 手"); gotoxy(2, 7); printf("(输入相应序号选择)"); key = _getch(); system("cls"); if (key == '1') control = 1; else if (key == '2') control = -1; else goto loop5; gotoxy(70, 5); printf(" 人 人 对 战 "); direct[1] = 15; direct[0] = 30; chess_board(); chess_menu(); while (flag == 0) { if (control == 1) { gotoxy(70, 22); BackGround(6, 0); printf(" 红 子 执 手 "); red_movexy(); red_chess(direct[1], direct[0]); flag = judge_winner(direct[1], direct[0], 1); } else { gotoxy(70, 22); BackGround(6, 0); printf(" 白 子 执 手 "); white_movexy(); white_chess(direct[1], direct[0]); flag = judge_winner(direct[1], direct[0], 2); } control = -control; } if (flag == 1) { BackGround(7, 0); MessageBox(NULL, "游戏结束,红子胜利", "五子棋游戏", MB_OK); } if (flag == 2) { MessageBox(NULL, "游戏结束,白子胜利", "五子棋游戏", MB_OK); } if (count >= 225) { MessageBox(NULL, "游戏结束,平局", "五子棋游戏", MB_OK); } } void man_machine()//人机对战模式 { loop6:system("cls"); char key; int control; gotoxy(2, 3); printf("1.玩 家 先 手(玩家为红子)"); gotoxy(2, 5); printf("2.电 脑 先 手(电脑为白子)"); gotoxy(2, 7); printf("(输入相应序号选择)"); key = _getch(); system("cls"); if (key == '1') control = 1; else if (key == '2') { control = 1; machine_chess(13, 26); } else goto loop6; gotoxy(70, 5); printf(" 人 机 对 战 "); direct[1] = 15; direct[0] = 30; chess_board(); chess_menu(); while (flag == 0) { if (control == 1) { gotoxy(70, 22); BackGround(6, 0); printf(" 玩 家 执 手 "); red_movexy(); red_chess(direct[1], direct[0]); flag = judge_winner(direct[1], direct[0], 1); } else { gotoxy(70, 22); BackGround(6, 0); printf(" 电 脑 执 手 "); machine_defend(); machine_attack(); find_position(); machine_chess(direct[1], direct[0]); flag = judge_winner(direct[1], direct[0], 2); } control = -control; } gotoxy(8, 18); if (flag == 1) { BackGround(7, 0); MessageBox(NULL, "太厉害了,您竟然战胜了电脑!", "五子棋游戏", MB_OK); } if (flag == 2) { MessageBox(NULL, "游戏结束,您输给了电脑", "五子棋游戏", MB_OK); } if (count >= 225) { MessageBox(NULL, "平局", "五子棋游戏", MB_OK); } } void Regret()//悔棋函数 { gotoxy(regrey, regrex); BackGround(0, 0); printf(" "); status[regrex][regrey] = 0; gotoxy(regrey1, regrex1); BackGround(0, 0); printf(" "); status[regrex1][regrey1] = 0; count -= 2; } void welcome()//游戏菜单 { int k; char choose; system("cls"); for (k = 2; k <= 16; k += 2)//游戏菜单 { gotoxy(5, k); printf("|-----------------|"); } gotoxy(5, 3); printf("| 五 子 棋 游 戏 |"); gotoxy(5, 5); printf("| 菜 单 |"); gotoxy(5, 7); printf("| 1.人 人 对 战 |"); gotoxy(5, 9); printf("| 2.人 机 对 战 |"); gotoxy(5, 11); printf("| 3.游 戏 帮 助 |"); gotoxy(5, 13); printf("| 4.作 者 信 息 |"); gotoxy(5, 15); printf("| 5.退 出 游 戏 |"); gotoxy(5, 18); printf("输入菜单对应序号进行操作"); gotoxy(5, 20); printf("祝您游戏愉快!"); gotoxy(30, 18); } char Gametips()//游戏帮助 { char choose; int key; system("cls"); gotoxy(2, 3); printf("游戏操作:"); gotoxy(4, 5); printf("① 红色棋子WASD移动光标选择下棋位置,按空格键确认,按Q悔棋"); gotoxy(4, 7); printf("② 白色棋子↑↓←→移动光标选择下棋位置,按0确认,按B悔棋"); gotoxy(2, 19); printf("(按E键返回,按其它任意键退出)"); return _getch(); } char Auther()//作者信息 { system("cls"); gotoxy(2, 3); printf("作者:张洪浩"); gotoxy(2, 5); printf("(按E键返回,按其它任意键退出)"); return _getch(); } int main(void) { system("title 五子棋"); system("mode con cols=92 lines=33"); char choose, temp; loop: welcome(); choose = _getch(); switch (choose){ case '1': man_man(); break; case '2': man_machine(); break; case '3': temp = Gametips(); if (temp == 'E' || temp == 'e') goto loop; break; case '4': temp = Auther(); if (temp == 'E' || temp == 'e') goto loop; break; //case '5': //int message=MessageBox(NULL,"是否退出?","友情提示",MB_OKCANCEL); //if(IDCANCEL==message) // goto loop; //if(IDOK==message) break; } } ```
为什么记录一次会出现重复的数据
#include <stdio.h> #include <malloc.h> #include <stdlib.h> //定义杂项函数及内存分配函数 如malloc、free、system、atoi、atol、rand、exit等 #include <string.h> #include<conio.h> //#define NULL 0 #define LEN sizeof(struct message) struct message //定义结构体 { char name[15]; char number[15]; char phone[15]; char qq[13]; char addr[25]; struct message *next; //指向下一数据 }; int n; void creat() //建立电话簿 { int num; char choice[5]={'2'}; FILE *fp; struct message *head; struct message *p,*q; n = 0; p = q = (struct message *) malloc(LEN); system("title 建立电话簿 ");//设置标题 system("mode con cols=84 lines=30");//设置窗口大小 system("color 5f"); fp=fopen("通讯录1.txt","wb"); system("cls"); printf("\n请输入姓名:"); scanf("%s",p->name); printf("\n请输入电话号码:"); scanf("%s",p->phone); printf("\n请输入学号:"); scanf("%s",p->number); printf("\n请输入QQ:"); scanf("%s",p->qq); printf("\n请输入住址:"); scanf("%s",p->addr); fwrite(p,LEN,1,fp); fclose(fp); head = 0; num = 1; while(num!=0) { n = n+1; if(n==1) head = p; else q->next = p; q = p; p = (struct message *) malloc(LEN); //分配存储区 while(choice[0]!='1' && choice[0]!='0') //判断是否继续 { printf("\n1 继续输入\n 0 返回\n"); printf("请选择操作:"); scanf("%s",choice); } switch(choice[0]) { case '1': { system("title 建立电话簿 ");//设置标题 system("mode con cols=84 lines=30");//设置窗口大小 system("color 5f"); fp=fopen("通讯录1.txt","rb"); system("cls"); printf("\n请输入姓名:"); scanf("%s",p->name); printf("\n请输入电话号码:"); scanf("%s",p->phone); printf("\n请输入学号:"); scanf("%s",p->number); printf("\n请输入QQ:"); scanf("%s",p->qq); printf("\n请输入住址:"); scanf("%s",p->addr); fwrite(p,LEN,1,fp); fclose(fp); choice[0] = '2'; } continue; case '0': num = 0; system("cls"); } } q->next = 0; } void add() //添加通讯录 { int num; char choice[5]={'2'}; FILE *fp; struct message *head; struct message *p,*q; n = 0; p = q = (struct message *) malloc(LEN); //分配空间 system("title 添加通讯录 ");//设置标题 system("mode con cols=84 lines=30");//设置窗口大小 system("color 5f"); fp=fopen("通讯录1.txt","ab"); system("cls"); printf("\n请输入姓名:"); //输入内容 scanf("%s",p->name); printf("\n请输入电话号码:"); scanf("%s",p->phone); printf("\n请输入学号:"); scanf("%s",p->number); printf("\n请输入QQ:"); scanf("%s",p->qq); printf("\n请输入住址:"); scanf("%s",p->addr); fwrite(p,LEN,1,fp); fclose(fp); head = 0; num = 1; while(num!=0) { n = n+1; if(n==1) head = p; else q->next = p; q = p; p = (struct message *) malloc(LEN); //分配空间 while(choice[0]!='1' && choice[0]!='0') //判断是否继续 { printf("\n1 继续输入\n 0 返回\n"); printf("请选择操作:"); scanf("%s",choice); } switch(choice[0]) { case '1': { fp=fopen("通讯录1.txt","rb"); system("cls"); printf("\n请输入姓名:"); scanf("%s",p->name); printf("\n请输入电话号码:"); scanf("%s",p->phone); printf("\n请输入学号:"); scanf("%s",p->number); printf("\n请输入QQ:"); scanf("%s",p->qq); printf("\n请输入住址:"); scanf("%s",p->addr); fwrite(p,LEN,1,fp); fclose(fp); choice[0] = '2'; } continue; case '0': num = 0; system("cls"); } } q->next = 0; } void findname(struct message * fphead) //按姓名查找 { struct message *p; int a = 0; char findname[20]; system("cls"); printf("请输入要查找的姓名:\n"); scanf("%s",findname); for(p=fphead->next;p!=NULL;p=p->next) { if(strcmp(p->name,findname)==0) { printf("姓名 电话号码 学号 QQ 住址\n"); printf("%-15s %-15s %-15s %-13s %-25s\n",p->name,p->phone,p->number,p->qq,p->addr); a = 1; } } if(a != 1) printf("无此通讯录!\n"); } void findphone(struct message * fphead) //按电话查找 { struct message *p; int a = 0; char findphone[15]; system("cls"); printf("请输入要查找的电话:\n"); scanf("%s",findphone); for(p=fphead->next;p!=NULL;p=p->next) { if(strcmp(p->phone,findphone)==0) { printf("姓名 电话号码 学号 QQ 住址\n"); printf("%-15s %-15s %-15s %-13s %-25s\n",p->name,p->phone,p->number,p->qq,p->addr); a = 1; } } if(a != 1) printf("无此通讯录!\n"); } void findnumber(struct message * fphead) //按学号查找 { struct message *p; int a = 0; char findnumber[15]; system("cls"); printf("请键入要查找的学生学号:\n"); scanf("%s",findnumber); for(p=fphead->next;p!=NULL;p=p->next) { if(strcmp(p->number,findnumber)==0) { printf("姓名 电话号码 学号 QQ 住址\n"); printf("%-15s %-15s %-15s %-13s %-25s\n",p->name,p->phone,p->number,p->qq,p->addr); a = 1; } } if(a != 1) printf("无此通讯录!\n"); } void modify(struct message * fphead) //修改记录 { FILE *fp; struct message *p,*q; int a = 0; char findname[15]; system("title 查询通讯录 ");//设置标题 system("mode con cols=84 lines=30");//设置窗口大小 system("color 5f"); system("cls"); printf("请键入要查找的姓名:\n"); scanf("%s",findname); for(p=fphead->next;p!=NULL;p=p->next) { if(strcmp(p->name,findname)==0) { printf("姓名 电话号码 学号 QQ 住址\n"); printf("%-15s %-15s %-15s %-13s %-25s\n\n\n\n",p->name,p->phone,p->number,p->qq,p->addr); printf("\n请键入新姓名:"); scanf("%s",p->name); printf("\n请键入新电话号码:"); scanf("%s",p->phone); printf("\n请键入新学号:"); scanf("%s",p->number); printf("\n请键入新QQ:"); scanf("%s",p->qq); printf("\n请键入新住址:"); scanf("%s",p->addr); fp = fopen("通讯录2.txt","wb"); q = fphead->next; //P为链表头指针 while(q!=0) { fwrite(q,LEN,1,fp); if(q->next!=0) q = q->next; else q = 0; } fclose(fp); unlink("通讯录1.txt"); //用新文件覆盖原文件 rename("通讯录2.txt", "通讯录1.txt"); printf("修改成功!"); a = 1; } } if(a != 1) printf("无此通讯录!\n"); } void del(struct message * fphead) //删除记录 { FILE *fp,*fq; struct message *p,*q,*r; char sname[15]; p = q = (struct message *) malloc(LEN); p = fphead; system("title 删除记录 ");//设置标题 system("mode con cols=84 lines=30");//设置窗口大小 system("color 5f"); system("cls"); fp = fopen("通讯录1.txt","rb"); fq = fopen("通讯录2.txt","wb"); printf("请输入欲删除记录的姓名:"); scanf("%s",sname); while(strcmp(p->name,sname)!=0 && p->next!=0) //查找节点并删除该节点 { q = p; p = p->next; } if(strcmp(p->name,sname)==0) { if(p==fphead) fphead = p->next; else { q->next = p->next; } r = fphead->next; //r为链表头指针 while(r!=0) { fwrite(r,LEN,1,fq); if(r->next!=0) r = r->next; else r = 0; } printf("删除成功!"); } else { printf("无此通讯录!"); } fclose(fp); fclose(fq); unlink("通讯录1.txt"); //用新文件覆盖原文件 rename("通讯录2.txt", "通讯录1.txt"); } struct message * open(void) //打开文件,载入链表 { FILE *fp; struct message *p=NULL,*q=NULL,*temp=NULL,*fphead=NULL; fp=fopen("通讯录1.txt","rb"); fphead=(struct message *)malloc(LEN); //分配空间 temp = q = fphead; while(! feof(fp)) //循环读取,载入链表 { p=(struct message *)malloc(LEN); temp=q; q->next=p; q=p; fread(p,LEN,1,fp); } temp->next=NULL; fclose(fp); return(fphead); //返回链表头指针 } void print() //显示通讯录 { struct message *p; FILE *fp; system("title 显示通讯录 ");//设置标题 system("mode con cols=84 lines=30");//设置窗口大小 system("color 5f"); system("cls"); if((fp=fopen("通讯录1.txt","rb"))!=NULL) { printf("姓名 电话号码 学号 QQ 住址\n"); p = (struct message *)malloc(LEN); //分配空间 while(!feof(fp)) { fread(p,LEN,1,fp); printf("%-15s %-15s %-15s %-13s %-25s\n",p->name,p->phone,p->number,p->qq,p->addr); } fclose(fp); } else { printf("未建立通讯录!"); } } main() //主函数 { FILE * fp; struct message * fphead; int begin = 1,f; char choice[5]; while(begin == 1) { system("title 欢迎使用学生通讯录");//设置标题 system("mode con cols=84 lines=30");//设置窗口大小 system("color 5f"); printf("\t\t>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n"); printf("\t\t\t\t欢迎使用学生通讯录\n"); printf("\t\t<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n\n\n"); printf("\t\t\t*主窗口菜单*\n\n"); printf("\t\t\t1:显示通讯录中所有记录;\n\n"); printf("\t\t\t2:建立新通讯录;\n\n"); printf("\t\t\t3:添加新记录;\n\n"); printf("\t\t\t4:查询通讯录中的记录;\n\n"); printf("\t\t\t5:修改通讯录中的记录;\n\n"); printf("\t\t\t6:删除通讯录中的记录;\n\n"); printf("\t\t\t0:退出通讯录\n\n"); printf("请选择操作:"); scanf("%s",choice); switch(choice[0]) { case '1': { print(); printf("按任意键返回主菜单!\n"); getch(); system("cls"); } continue; case '2': { creat(); } continue; case '3': { add(); } continue; case '4': { if((fp = fopen("通讯录1.txt","rb")) != NULL) { fclose(fp); system("title 查询通讯录 ");//设置标题 system("mode con cols=84 lines=30");//设置窗口大小 system("color 5f"); system("cls"); printf("1按姓名查询;\n2按电话查询;\n3按学号查询;\n"); printf("请输入查询方式:"); scanf("%d",&f); if(f==1) { fphead = open(); findname(fphead); } if(f==2) { fphead = open(); findphone(fphead); } else if(f==3) { fphead = open(); findnumber(fphead); } } else { system("cls"); printf("未建立通讯录!"); } printf("按任意键返回主菜单!\n"); getch(); system("cls"); } continue; case '5': { if((fp = fopen("通讯录1.txt","rb")) != NULL) { fclose(fp); fphead = open(); modify(fphead); } else { system("cls"); printf("未建立通讯录!"); } printf("按任意键返回主菜单!\n"); getch(); system("cls"); }continue; case '6': { if((fp = fopen("通讯录1.txt","rb")) != NULL) { fclose(fp); fphead = open(); del(fphead); } else { system("cls"); printf("未建立通讯录!"); } printf("按任意键返回主菜单!\n"); getch(); system("cls"); } continue; case '0': exit(0); default: { system("cls"); printf("输入错误,按任意键返回主菜单!\n"); getch(); system("cls"); } } } system("pause"); }
<%@ taglib prefix="myfun" uri="http://hellking.co
[size=medium][color=red]<%@ taglib prefix="myfun" uri="http://hellking.com/function"%> [/color][/size] <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> <%@ page contentType="text/html; charset=gb2312" language="java" %> <%@ page isELIgnored ="false" %> <html> <head> <title>表达式语言的使用 </title> </head> <body bgcolor="#FFFFFF"> <hr>提交的内容是: ${myfun:trans(param.name)} <hr> <form action="function.jsp" method=get name=form1> <input type=text name="name"> <input type=submit value=提交> </form> <hr> <hr> 另一个函数的使用,结果是: ${myfun:add(param["x"],param["y"])} <form action="function.jsp" method=get name=form2> <input type=text name="x"> <input type=text name="y"> <input type=submit value=提交> </form> </body> </html> function函数如下: package com.jspdev.ch16; import java.io.*; public class Function { public static String trans(String chi) { String result = null; byte temp []; try { temp=chi.getBytes("iso-8859-1"); result = new String(temp); } catch(UnsupportedEncodingException e) { System.out.println (e.toString()); } return result; } public static int add(int x,int y) { return x+y; } } 在第一行下面有如下错误提示:Cannot find the tag librar descriptor for http://hellking.com/function。请问高人们怎么解决?谢谢!
关于C语言读入文件后 管理存储字符串的问题(问题未确定)
vs2010报错是“Windows 已在 公交查询系统.exe 中触发一个断点。 其原因可能是堆被损坏,这说明 公交查询系统.exe 中或它所加载的任何 DLL 中有 Bug。 原因也可能是用户在 公交查询系统.exe 具有焦点时按下了 F12。” 代码如下: #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include<string.h> #include<ctype.h> #include<stdlib.h> #include<iostream> long long a; #define stop system("pause"); #define home(x) printf("%p\n",x); int j;//控制项目数组 struct item { int number; char*Item; }; int main(int argc,char *argv[]) { system("color f9"); system("title 公交查询系统"); FILE *fp; int i;//线路选择 char c; c=(char)malloc(sizeof(char)); printf("字符变量的地址是:"); home(c); int amount=0;//交通线路的数量 fp=fopen("file.txt","rb+"); if(fp==NULL) { printf("获取失败╮(╯▽╰)╭\n"); system("pause"); return 0; } printf("文件指针的地址是:%p\n",fp);//确保文件指针分配到了内存 fseek(fp,0,SEEK_END); int file_size=ftell(fp);//计算文件的大小 fseek(fp,0,SEEK_SET); char *str=NULL;//不知道有没有分配内存 str=(char*)malloc(sizeof(*fp));//分配一个文件大小的内存给指针 printf("指针str的地址是:"); home(str);//用C语言宏 确认str指针分配到了地址 str[file_size]='\0';//用空字符结尾 防止字符串乱码 fread((void*)str,file_size,1,fp);//把文件内容读给str printf("文件大小:%d\n",file_size);//确认文件大小正确 不为零 int seek=0;//设置循环变量 while(seek<file_size) { if(str[seek]=='.')//检索项 用数组运算符 遇到'.'分为一项 { amount++;//amount是项目数 static char*one=NULL;//静态变量 作为str的副本╮(╯▽╰)╭ one=(char*)malloc(sizeof(*fp)); static int one_1=1; static int seek_1=seek; while(one_1<=seek) { sprintf(one,"%c",str[one_1]); } } seek++; } if((c=getc(fp))!=NULL) { printf("读入到文件尾!\n"); } puts(str);//检查文件内容是否不存在 std::cout<<amount<<std::endl; fclose(fp); fp=NULL; struct item ch[5]; {//使自动变量在代码块结尾 退出堆 int i=1; char*ch_1=NULL;//存储项的内容 ch_1=(char*)malloc(sizeof(char*)); printf("临时字符串的地址:%p\n",ch_1);//确保字符串分配到了地址 stop;//C语言宏 system("pause"); while(i<amount) { do{ c=str[a]; sprintf(ch_1,"%c",c,'\0'); }while(a==1); std::cout<<ch_1<<"\n"<<c<<"\n";//确保临时字符串有内容 ch[j].Item=NULL; ch[j].Item=(char*)malloc(sizeof(*fp)); printf("项目的地址:%p\n",ch[j].Item);//确保存储项的结构数组中的指针分配到了内存 std::cout<<j<<"\n";//确保下标未越界 stop; while(ch_1!="。") { ch[j].number=i;//此时 第一项 用number标识这是第几项 strcat(ch[j].Item,ch_1);//把ch_1的内容给连接在指针的末尾 if(c==0) { std::cout<<"读取失败\n"; stop; std::cout<<ch[j].Item<<"\n"; stop; } c=str[a];//继续获取文件内容 sprintf(ch_1,"%c",c); a++; } strcat(ch[j].Item,"。"); j++; i++; } free(ch_1); } printf("1.数据维护(增加项、删除项)\n2.查询\n3.退出\n"); scanf("%d",&i); switch(i) { case 1: int a; printf("你真的做决定了吗?如果你确定的话请选择:\n1.增加项\n2.退出\n"); scanf("%d",&a); if(a==1) { fp=fopen("file.txt","w+");//以读模式来覆盖文本 方便添加项目 char*add_1=(char*)malloc(sizeof(*fp)); sprintf(add_1,"%d.",++amount);//add_1存储文件的序号 如当前有5项 char*add_2=(char*)malloc(sizeof(*fp));//add_2是要添加的文本 printf("在此处添上你要添加的文本\n"); scanf("%s",add_2); strcat(add_1,add_2); strcat(add_1,"。"); strcat(str,add_1);//把文本添加到末尾 puts(str); stop; fprintf(fp,"\n"); fprintf(fp,str);//确认添加成功 fclose(fp); fp=NULL; add_1=add_2=NULL; free(add_1); free(add_2); } else if(a==2) { fp=fopen("file.txt","w+"); int d; printf("请选择你要删除第几项\n"); scanf("%d",&d); ch[d].Item=""; str=""; for(j=1;;j++) { strcat(str,ch[j].Item); } fprintf(fp,str); fclose(fp); fp=NULL; for(seek=0;seek<amount;seek++) { free(ch[seek].Item); } } break; case 2: puts(str); break; case 3: system("pause"); return 0; break; default: break; } str=NULL; free(str); system("pause"); return 0; } ![图片说明](https://img-ask.csdn.net/upload/201510/01/1443664194_232169.jpg) ![图片说明](https://img-ask.csdn.net/upload/201510/01/1443664424_429320.jpg) 运行结果在附属的图片中 还请帮忙看看是什么地方出了错误..
C# datatable 插入行,之前插入的为何不能保存?
前台 ==================== ``` <%@ Page Language="C#" AutoEventWireup="true" CodeFile="inproduct.aspx.cs" Inherits="inproduct" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> </head> <body> <form id="form1" runat="server"> <div> <asp:Button ID="Button1" runat="server" Text="添加第一行" OnClick="Button1_Click" /> <asp:Button ID="Button2" runat="server" Text="添加第二行" OnClick="Button2_Click" /> <asp:GridView ID="GridView1" runat="server" EnableModelValidation="True"> </asp:GridView> </div> </form> </body> </html> ``` ======================= 后台 ``` using System; using System.Collections.Generic; using System.Data; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class inproduct : System.Web.UI.Page { public DataTable dt = new DataTable(); protected void Page_Load(object sender, EventArgs e) { DataColumn dc1 = new DataColumn("prizename", Type.GetType("System.String")); DataColumn dc2 = new DataColumn("point", Type.GetType("System.Int16")); DataColumn dc3 = new DataColumn("number", Type.GetType("System.Int16")); DataColumn dc4 = new DataColumn("totalpoint", Type.GetType("System.Int64")); DataColumn dc5 = new DataColumn("prizeid", Type.GetType("System.String")); dt.Columns.Add(dc1); dt.Columns.Add(dc2); dt.Columns.Add(dc3); dt.Columns.Add(dc4); dt.Columns.Add(dc5); DataRow dr = dt.NewRow(); dr["prizename"] = "娃娃1"; dr["point"] = 10; dr["number"] = 1; dr["totalpoint"] = 10; dr["prizeid"] = "001"; dt.Rows.Add(dr); GridView1.DataSource = dt; GridView1.DataBind(); } protected void Button1_Click(object sender, EventArgs e) { DataRow dr = dt.NewRow(); dr["prizename"] = "娃娃2"; dr["point"] = 20; dr["number"] = 2; dr["totalpoint"] = 20; dr["prizeid"] = "002"; dt.Rows.Add(dr); GridView1.DataSource = dt; GridView1.DataBind(); } protected void Button2_Click(object sender, EventArgs e) { DataRow dr2 = dt.NewRow(); dr2["prizename"] = "娃娃3"; dr2["point"] = 30; dr2["number"] = 3; dr2["totalpoint"] = 30; dr2["prizeid"] = "003"; dt.Rows.Add(dr2); GridView1.DataSource = dt; GridView1.DataBind(); } } ```
datatable 插入行怎么只能插一次?如何做到点一次按钮插入一条,之前内容保留
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="inproduct.aspx.cs" Inherits="inproduct" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> </head> <body> <form id="form1" runat="server"> <div> <asp:Button ID="Button1" runat="server" Text="插入一行" OnClick="Button1_Click" /> <asp:Button ID="Button2" runat="server" Text="再插入一行" OnClick="Button2_Click" /> <asp:GridView ID="GridView1" runat="server" EnableModelValidation="True"> </asp:GridView> </div> </form> </body> </html> ============================== 后台程序 using System; using System.Collections.Generic; using System.Data; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class inproduct : System.Web.UI.Page { public DataTable dt = new DataTable(); protected void Page_Load(object sender, EventArgs e) { DataColumn dc1 = new DataColumn("prizename", Type.GetType("System.String")); DataColumn dc2 = new DataColumn("point", Type.GetType("System.Int16")); DataColumn dc3 = new DataColumn("number", Type.GetType("System.Int16")); DataColumn dc4 = new DataColumn("totalpoint", Type.GetType("System.Int64")); DataColumn dc5 = new DataColumn("prizeid", Type.GetType("System.String")); dt.Columns.Add(dc1); dt.Columns.Add(dc2); dt.Columns.Add(dc3); dt.Columns.Add(dc4); dt.Columns.Add(dc5); DataRow dr = dt.NewRow(); dr["prizename"] = "娃娃1"; dr["point"] = 10; dr["number"] = 1; dr["totalpoint"] = 10; dr["prizeid"] = "001"; dt.Rows.Add(dr); GridView1.DataSource = dt; GridView1.DataBind(); } protected void Button1_Click(object sender, EventArgs e) { DataRow dr = dt.NewRow(); dr["prizename"] = "娃娃2"; dr["point"] = 20; dr["number"] = 2; dr["totalpoint"] = 20; dr["prizeid"] = "002"; dt.Rows.Add(dr); GridView1.DataSource = dt; GridView1.DataBind(); } protected void Button2_Click(object sender, EventArgs e) { DataRow dr2 = dt.NewRow(); dr2["prizename"] = "娃娃3"; dr2["point"] = 30; dr2["number"] = 3; dr2["totalpoint"] = 30; dr2["prizeid"] = "003"; dt.Rows.Add(dr2); GridView1.DataSource = dt; GridView1.DataBind(); } }
datatable 怎么只能插入一行吗?插入第二行就替代第一行了,不会累加插入。
前台 ``` <%@ Page Language="C#" AutoEventWireup="true" CodeFile="inproduct.aspx.cs" Inherits="inproduct" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> </head> <body> <form id="form1" runat="server"> <div> <asp:Button ID="Button1" runat="server" Text="添加第一行" OnClick="Button1_Click" /> <asp:Button ID="Button2" runat="server" Text="添加第二行" OnClick="Button2_Click" /> <asp:GridView ID="GridView1" runat="server" EnableModelValidation="True"> </asp:GridView> </div> </form> </body> </html> ``` =========================== 后台程序 ``` using System; using System.Collections.Generic; using System.Data; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class inproduct : System.Web.UI.Page { public DataTable dt = new DataTable(); protected void Page_Load(object sender, EventArgs e) { DataColumn dc1 = new DataColumn("prizename", Type.GetType("System.String")); DataColumn dc2 = new DataColumn("point", Type.GetType("System.Int16")); DataColumn dc3 = new DataColumn("number", Type.GetType("System.Int16")); DataColumn dc4 = new DataColumn("totalpoint", Type.GetType("System.Int64")); DataColumn dc5 = new DataColumn("prizeid", Type.GetType("System.String")); dt.Columns.Add(dc1); dt.Columns.Add(dc2); dt.Columns.Add(dc3); dt.Columns.Add(dc4); dt.Columns.Add(dc5); DataRow dr = dt.NewRow(); dr["prizename"] = "娃娃1"; dr["point"] = 10; dr["number"] = 1; dr["totalpoint"] = 10; dr["prizeid"] = "001"; dt.Rows.Add(dr); GridView1.DataSource = dt; GridView1.DataBind(); } protected void Button1_Click(object sender, EventArgs e) { DataRow dr = dt.NewRow(); dr["prizename"] = "娃娃2"; dr["point"] = 20; dr["number"] = 2; dr["totalpoint"] = 20; dr["prizeid"] = "002"; dt.Rows.Add(dr); GridView1.DataSource = dt; GridView1.DataBind(); } protected void Button2_Click(object sender, EventArgs e) { DataRow dr2 = dt.NewRow(); dr2["prizename"] = "娃娃3"; dr2["point"] = 30; dr2["number"] = 3; dr2["totalpoint"] = 30; dr2["prizeid"] = "003"; dt.Rows.Add(dr2); GridView1.DataSource = dt; GridView1.DataBind(); } } ```
采用ADO.NET访问SQL Server
在Microsoft Visual Studio环境中,采用C#语言实现的 **Default.aspx** ``` <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>查询成绩</title> </head> <body> <form id="form1" runat="server"> <div>&nbsp;</div> <table align="center" style="width:387px;height:34px;"> <tr align="center" valign="middle"> <td> <asp:Label ID="label1" runat="server" Text="查询成绩" Font-Bold="True" Font-Names="黑体" Font-Size="X-Large" ForeColor="Red"></asp:Label> </td> </tr> </table> <table align="center" style="width:387px;"> <tr> <td style="width:81px" align="right"> <asp:Label ID="label2" runat="server" Text="姓 名" Width="61px" ForeColor="Blue"></asp:Label> </td> <td style="width:158px"> <asp:TextBox ID="TBSname" runat="server" Width="290px"></asp:TextBox> </td> </tr> <tr> <td style="width:81px" align="right"> <asp:Label ID="label3" runat="server" Text="课程名" ForeColor="Blue"></asp:Label> </td> <td style="width:158px"> <asp:TextBox ID="TBCname" runat="server" Width="291px"></asp:TextBox> </td> </tr> <tr> <td style="width:81px" align="right"> <asp:Label ID="label4" runat="server" Text="成 绩" Width="53px" ForeColor="Blue"></asp:Label> </td> <td style="width:158px"> <asp:Label ID="LaScore" runat="server" Width="297px" BackColor="#C0FFFF" ForeColor="Fuchsia"></asp:Label> </td> </tr> </table> <table align="center" style="width:387px"> <tr align="center"> <td style="height:36px"> <asp:Button ID="BTQuery" runat="server" Text="查 询" OnClick="BTQuery_Click" /> </td> </tr> </table> </form> </body> </html> ``` **Default.aspx.cs** ``` using System; using System.Data; using System.Data.SqlClient; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void BTQuery_Click(object sender, EventArgs e) { string connString; string SName, CName; //获取姓名和课程名 SName = TBSname.Text; CName = TBCname.Text; //设置数据库连接串,使用系统认证 connString = "Initial Catalog=jiaoxuedb;Data Source=LENOVO-PC;Integrated Security=SSPI;"; SqlConnection Conn = new SqlConnection(connString); SqlCommand QueryCommand = new SqlCommand("Select Score FROM Student,Course,SC" + "WHERE Student.Sno=SC.Sno and Course.Cno=SC.Cno and " + "Sname=@SName and Cname=@CName", Conn); QueryCommand.Parameters.Add("@SName", SqlDbType.Char, 8); QueryCommand.Parameters.Add("@CName", SqlDbType.Char, 20); QueryCommand.Parameters["@SName"].Value = SName; QueryCommand.Parameters["@CName"].Value = CName; Conn.Open(); //执行QueryCommand.ExecuteScalar方法查询成绩 try { Int32 ScoreValue = (Int32)QueryCommand.ExecuteScalar(); LaScore.Text = Convert.ToString(ScoreValue); } catch //错误处理 { LaScore.Text = "没有成绩"; } finally { Conn.Close(); } } } ``` 不知道为什么不管是输入什么都是显示没有成绩 求助谢谢~
C语言写的一个实时时间小程序,用的多线程屏幕问题
这是一个子程序,我想把这个调试好了加到另一个工程里,因为要实时显示时间,所以用到了多线程,现在的问题是子线程执行的时候 光标就移动到这行后面,主线程再打印什么东西的时候,屏幕显示就乱套了,怎么能解决啊,下面是代码片段。 ``` void real_time(int X,int Y) //显示时间的函数,用到了光标移动函数,X,Y表示坐标 { HideCursor(10, 0); //隐藏光标函数 hout = GetStdHandle(STD_OUTPUT_HANDLE); struct tm *ptr; ptr = Time(); SetCur(X, Y); //这个函数没贴出,用于移动光标 printf("%d-%d-%d ", ptr->tm_year + 1900, ptr->tm_mon + 1, ptr->tm_mday); printf("%02d:", ptr->tm_hour); printf("%02d:", ptr->tm_min); while (1) { ptr = Time(); if (ptr->tm_min == 0) { SetCur(X+10, Y); printf("%02d:%02d:%02d", ptr->tm_hour, ptr->tm_min, ptr->tm_sec); continue; } else { if (ptr->tm_sec == 0) { SetCur(X+13, Y); printf("%02d:%02d", ptr->tm_min, ptr->tm_sec); continue; } else { SetCur(X+16, Y); //秒要变化,这里移动光标实现覆盖 printf("%02d", ptr->tm_sec); } } } } ``` ``` DWORD WINAPI ThreadProc1(LPVOID lpParam) //子线程 { real_time(0,1); //在第二行打印时间 return 0; } ``` ``` void main() { system("title 实时时间"); CreateThread(NULL, 0, ThreadProc1, NULL, 0, NULL); //创建线程 printf("\n\n\n"); //这里即使换行,最后的内容 printf("输入序号:"); //下面的代码只是模拟其他线程的操作 int k; SetCur(0, 4); //即使设置光标到第5行,控制台窗口打印出的依然在子线程后面 scanf("%d", &k); char ch = getchar(); ············ ············ } ``` 正常执行后这样 ![正常执行后这样](https://img-ask.csdn.net/upload/201508/19/1439983378_846765.png) 输入0后,0显示在秒的后面! ![输入0后,0显示在秒的后面!](https://img-ask.csdn.net/upload/201508/19/1439983434_323691.png) 怎么能让他不受子线程的影响
spring的多文件上传无法上传
各位大神,我做了一个springMVC的多文件上传,使用fileinput.min.js插件,前台将上传方法嵌套在添加方法里面调用,运行后添加的字段添加了,文件并没有上传,前后台均没有报异常,似乎没有跑上传那段代码 前台html: <form id="form_1" class="easyui-form" method="post" data-options="novalidate:true" onsubmit="returncheck()" > <table> <tr> <td class="td1">图片:</td> <td colspan="3" class="td2"><input name="add_pic" id="add_pic" type = "file" style="border:#FFF 1px solid; overflow:hidden; font-size:10px" multiple /></td> </tr> </table> </form> 前台js: function initFileInput() { alert("123") $("#add_pic").fileinput({ language: 'zh', //设置语言 uploadUrl: "../services/engineering/upload.do", //上传的地址 allowedFileExtensions : ['jpg', 'png','gif','mp4'],//接收的文件后缀 showUpload: false, //是否显示上传按钮 showCaption: false,//是否显示标题 browseClass: "btn btn-primary", //按钮样式 maxFileCount : 3, // 表示允许同时上传的最大文件个数 }); alert("走完了") $("#edit_pic").fileinput({ language: 'zh', //设置语言 uploadUrl: "../services/engineering/upload.do", //上传的地址 allowedFileExtensions : ['jpg', 'png','gif','mp4'],//接收的文件后缀 showUpload: false, //是否显示上传按钮 showCaption: false,//是否显示标题 browseClass: "btn btn-primary", //按钮样式 maxFileCount : 3, // 表示允许同时上传的最大文件个数 }); } initFileInput(); //表单提交事件 function submitForm() { var q = {}; if (flag == "1s") { $("add_pic").fileinput('upload'); q.engineergingname = $("#add_title").val(); q.manager = $("#add_fzr").val(); $.ajax({ type : "POST", contentType : "application/json", dataType : "json", url : "../services/engineering/add.do", data : JSON.stringify(q), success : function(data) { } }); } 后台controller // 文件上传公用方法 private boolean saveFile(CommonsMultipartFile file) throws IllegalStateException, IOException { String originalFilename = file.getOriginalFilename(); if(file!=null && originalFilename!=null && originalFilename.length()>0){ String path ="C:\\temp\\"; String NewFilename = UUID.randomUUID() + originalFilename.substring(originalFilename.lastIndexOf(".")); File newFile = new File(path+NewFilename); file.transferTo(newFile); System.out.println(path+NewFilename); System.out.println("上传成功"); return true; } System.out.println("上传失败"); return false; } @RequestMapping("/upload") public String filesUpload(@RequestParam("add_pic") CommonsMultipartFile[] files) throws IllegalStateException, IOException { //判断file数组不能为空并且长度大于0 System.out.println("jinlaile"); if(files!=null&&files.length>0){ //循环获取file数组中得文件 for(int i = 0;i<files.length;i++){ CommonsMultipartFile file = files[i]; //保存文件 saveFile(file); } } System.out.println("走完了"); // 重定向 return "SUCCESS"; }
编程绘制小球的动态碰撞轨迹?
编程绘制小球的动态碰撞轨迹。在屏幕的同一水平线上(设备坐标系)有两个小球,当第一个小球撞击另一个小球后,前者静止,后者将沿前一个小球的运动方向继续运动。 ``` //程序名称:printf()动画—运动的小球 #include<stdio.h> #include<windows.h> #include<stdlib.h> #include<conio.h> //定义延时时间,运动区的宽度和高度 #define DELAY 100 #define WIDTH 80 #define HEIGHT 24 //定义全局变量,位置和速度 int X1 = 0, Y1 =10,X2=40,Y2=10; int Vx1 = 1, Vy1 = 0,Vx2=1,Vy2=0; int t,i=0; //函数声明 void Ball(); void HideCursor(); void GotoXy(int x, int y); int main(void) { //接收键盘数据的变量 char ch = '\0'; system("color 2C"); system("title 运动的小球-动量守恒"); //隐藏光标 HideCursor(); //ESC退出 while(ch != 27) { Ball(); if(kbhit()) ch = getch(); } system("cls"); //结束程序 return 0; } //计算球的轨迹 void Ball() { //画球 GotoXy(X1, Y1); printf("●"); GotoXy(X2,Y2); printf("●"); //延时 Sleep(DELAY); //擦球 GotoXy(X1, Y1); printf(" "); GotoXy(X2,Y2); printf(""); //触界反弹 if(0==X1&&Vx1<0) {putchar('\007'); } if((WIDTH - 2) == X2 && Vx2 > 0) {Vx2 *= -1; putchar('\007');} if(X1=X2-2) {t=Vx1; Vx1=Vx2; Vx2=t; i*=-1; putchar('\007'); } //计算下一个周期的位置 switch(i) { case 1: X1 += 2 * Vx1;break; case -1: X2 += 2 * Vx2;break; } } //隐藏光标,头文件<windows.h> void HideCursor() { CONSOLE_CURSOR_INFO cursor_info = {1, 0}; //后边的0代表光标不可见 SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info); } //光标移动,头文件<windows.h> void GotoXy(int x, int y) { HANDLE hout; //定义句柄变量hout COORD coord; //定义结构体coord coord.X = x; coord.Y = y; hout = GetStdHandle(STD_OUTPUT_HANDLE); //获得标准输出(屏幕)句柄 SetConsoleCursorPosition(hout, coord); //移动光标 } ```
c#bootstrap上传文件服务器打不开报错,读取二进制流的问题待解决
## html ``` <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>Krajee JQuery Plugins - &copy; Kartik</title> <link href="bootstrap.min.css" rel="stylesheet" /> <link href="fileinput.css" media="all" rel="stylesheet" type="text/css" /> <script src="Jquery.min.js"></script> <script src="fileinput.js" type="text/javascript"></script> <script src="bootstrap.min.js" type="text/javascript"></script> <script src="zh.js"></script> </head> <body> <form> <div> <div class="modal-header"> <h4 class="modal-title" id="modalShow">[请选择xml/docx]文件</h4> </div> <div class="modal-body"> <input type="file" name="model_file" id="model_file" multiple class="file-loading" /> </div> </div> </form> <script type="text/javascript"> $(function () { var control = $("#model_file"); var uploadrul = "/bootstrap-fileinput-master/examples/UploadFile.ashx"; var upObj = { language: 'zh', //设置语言 uploadUrl: uploadrul, //上传的地址 uploadExtraData: { "savepath": "/bootstrap-fileinput-master/examples/" },//上传至服务器的参数,非常重要 allowedFileExtensions: ['xml', 'docx', 'jpg', 'png', 'gif', 'rar', 'doc', 'txt'],//接收的文件后缀 showUpload: true, //显示批量上传按钮 showCaption: false,//是否显示标题 browseClass: "btn btn-primary", //按钮样式 dropZoneEnabled: true,//是否显示拖拽区域 maxFileSize: 4096,//单位为kb,如果为0表示不限制文件大小 minFileCount: 0, maxFileCount: 10, msgSizeTooLarge: " \"{name}\" 大小为({size} KB) 最大文件大小为 {maxSize} KB.请重新上传!",//文件的实际大小有些许偏差 enctype: 'multipart/form-data', validateInitialCount: true, previewFileIcon: "<i class='glyphicon glyphicon-king'></i>", msgFilesTooMany: "选择上传的文件数量({n}) 超过允许的最大数值{m}!", allowedPreviewTypes: ['image']//能够预览的文件类型,如果不限制。文件预览时可能很慢 }; $('#modalShow').html("[请选择"+upObj.allowedFileExtensions+"]文件"); control.fileinput(upObj); //导入文件上传成功之后的事件 $("#model_file").on("fileuploaded", function (event, data, previewId, index) { }); //导入文件上传失败之后的事件 $('#model_file').on('fileuploaderror', function (event, data, msg) { var msg= data.response; }); }); </script> </body> </html> ``` ## ashx ``` using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.IO; using System.Text; namespace WebApplication1.bootstrap_fileinput_master.examples { /// <summary> /// UploadFile 的摘要说明 /// </summary> public class UploadFile : IHttpHandler { public void ProcessRequest(HttpContext context) { string json = "{\"msg\":\"上传成功!\"}"; try { //读取二进制流为什么 有问题 context.Response.ContentType = "text/plain"; Stream sr = context.Request.InputStream; byte[] bt = new byte[sr.Length]; HttpPostedFile file = context.Request.Files["model_file"]; string savepath = context.Request["savepath"];//获取文件保存的路径 string fileName = file.FileName; sr.Read(bt, 0, bt.Length); savepath = context.Server.MapPath(savepath) + "\\" + fileName; FileStream fs = new FileStream(savepath, FileMode.Create); fs.Write(bt, 0, bt.Length); fs.Close(); sr.Close(); } catch (Exception ex) { //失败时返回的参数必须加 error键 json = "{\"error\":\""+ex.Message+"\"}"; } context.Response.Write(json); context.Response.End(); } public bool IsReusable { get { return false; } } } } ``` ## 读取数据流的时候有问题,读取到上传文件的属性数据了,见下图2 ![读取数据流的时候用问题](https://img-ask.csdn.net/upload/201710/10/1507618593_496298.png) ##上传文件源数据 ![上传文件源数据](https://img-ask.csdn.net/upload/201710/10/1507618626_265907.png) ## 服务器上文件的内容 ![服务器上文件的内容](https://img-ask.csdn.net/upload/201710/10/1507618659_951615.png) **上传图片、word、excel文件后,打开失败。** ## 附件:[上传文件测试工程demo上传文件测试工程demo](https://pan.baidu.com/s/1kVsZXTt "上传文件测试工程demo")
java web找不到哪里缺;)}。
``` <%@ page language="java" import="java.util.*" pageEncoding="GBK"%> <HTML xmlns=""><HEAD><TITLE>OnlineShop在线商城 - 后台管理</TITLE> <META http-equiv=Content-Type content="text/html; charset=gb2312"><LINK href="images/style.css" type=text/css rel=stylesheet> <STYLE>.main_left { TABLE-LAYOUT: auto; BACKGROUND: url(images/left_bg.gif) } .main_left_top { BACKGROUND: url(images/left_menu_bg.gif); PADDING-TOP: 5px } .main_left_title { PADDING-LEFT: 15px; FONT-WEIGHT: bold; FONT-SIZE: 14px; COLOR: #fff; TEXT-ALIGN: left } .left_iframe { BACKGROUND: none transparent scroll repeat 0% 0%; VISIBILITY: inherit; WIDTH: 180px; HEIGHT: 92% } .main_iframe { Z-INDEX: 1; VISIBILITY: inherit; WIDTH: 100%; HEIGHT: 92% } TABLE { FONT-SIZE: 12px; FONT-FAMILY: tahoma, 宋体, fantasy } TD { FONT-SIZE: 12px; FONT-FAMILY: tahoma, 宋体, fantasy } </STYLE> <SCRIPT language=javaScript src="images/admin.js" type=text/javascript></SCRIPT> <SCRIPT language=javascript src="images\Admin(1).js"></SCRIPT> <SCRIPT> var status = 1; var Menus = new DvMenuCls; document.onclick=Menus.Clear; function switchSysBar(){ if (1 == window.status){ window.status = 0; switchPoint.innerHTML = '<img src="images/left.gif">'; document.all("frmTitle").style.display="none" } else{ window.status = 1; switchPoint.innerHTML = '<img src="images/right.gif">'; document.all("frmTitle").style.display="" } } </SCRIPT> <META content="MSHTML 6.00.2900.5726" name=GENERATOR></HEAD> <BODY style="MARGIN: 0px"><!--导航部分--> <DIV class=top_table> <DIV class=top_table_leftbg> <DIV class=system_logo><IMG src="images/logo_up.gif"></DIV> <DIV class=menu> <UL></UL></DIV></DIV></DIV> <DIV style="BACKGROUND: #337abb; HEIGHT: 24px"></DIV><!--导航部分结束--> <TABLE style="BACKGROUND: #337abb" height="92%" cellSpacing=0 cellPadding=0 width="100%" border=0> <TBODY> <TR> <TD class=main_left id=frmTitle vAlign=top align=middle name="fmTitle"> <TABLE class=main_left_top cellSpacing=0 cellPadding=0 width="100%" border=0> <TBODY> <TR height=32> <TD vAlign=top></TD> <TD class=main_left_title id=leftmenu_title><font color="#0ec74a">OnlineShop</font></TD> <TD vAlign=top align=right></TD></TR></TBODY></TABLE><IFRAME class=left_iframe id=frmleft name=frmleft src="images/left.htm" frameBorder=0 allowTransparency></IFRAME> <TABLE cellSpacing=0 cellPadding=0 width="100%" border=0> <TBODY> <TR height=32> <TD vAlign=top></TD> <TD vAlign=bottom align=middle></TD> <TD vAlign=top align=right></TD></TR></TBODY></TABLE></TD> <TD style="WIDTH: 10px" bgColor=#337abb> <TABLE height="100%" cellSpacing=0 cellPadding=0 border=0> <TBODY> <TR> <TD style="HEIGHT: 100%" onclick=switchSysBar()> <SPAN class=navPoint id=switchPoint title=关闭/打开左栏><IMG src="images/right.gif"></SPAN> </TD></TR></TBODY></TABLE></TD> <TD vAlign=top width="100%" bgColor=#337abb> <TABLE cellSpacing=0 cellPadding=0 width="100%" bgColor=#c4d8ed border=0><TBODY> <TR height=32> <TD vAlign=top width=10 background=images/bg2.gif><IMG alt="" src="images/teble_top_left.gif"></TD> <TD width=28 background=images/bg2.gif></TD> <TD background=images/bg2.gif><SPAN style="FLOAT: left">OnlineShop在线商城 - 后台管理</SPAN><SPAN id=dvbbsannounce style="FONT-WEIGHT: bold; FLOAT: left; WIDTH: 300px; COLOR: #c00"></SPAN></TD> <TD style="COLOR: #135294; TEXT-ALIGN: right" background=images/bg2.gif>| <A href="#" target=_top><a href="adminIndex.jsp">后台首页</a></A> | <A href="index.jsp" target=_top>商城首页</A> | <A href="javascript:AdminOut()" target=_top>退出</A> </TD> <TD vAlign=top align=right width=28 background=images/bg2.gif><IMG alt="" src="images/teble_top_right.gif"></TD> <TD align=right width=16 bgColor=#337abb></TD></TR></TBODY></TABLE><IFRAME class=main_iframe id=frmright name=frmright src="images/syscome.htm" frameBorder=0 scrolling=yes></IFRAME> <TABLE style="BACKGROUND: #c4d8ed" cellSpacing=0 cellPadding=0 width="100%" border=0> <TBODY> <TR> <TD><IMG height=6 alt="" src="images/teble_bottom_left.gif" width=5></TD> <TD align=right><IMG height=6 alt="" src="images/teble_bottom_right.gif" width=5></TD> <TD align=right width=16 bgColor=#337abb></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE> <DIV id=dvbbsannounce_true style="DISPLAY: none"></DIV> <SCRIPT language=JavaScript> document.getElementById("dvbbsannounce"). innerHTML = document.getElementById("dvbbsannounce_true").innerHTML; //上一句末尾 一直提示在此行找到多个注释:在此行找到多个注释 - 语法错误,将“)”插入到完整表达式中- 缺少分号- 语法错误,将“}”插入到完整 方法体 中 </SCRIPT> </BODY></HTML> ``` document.getElementById("dvbbsannounce"). innerHTML = document.getElementById("dvbbsannounce_true").innerHTML; 这句一直提示出错,不知道怎么改
Gson解析jsonString 出现问题,急!急!急!
解析前的对象: public class BBSInformation { private String BBSTitle = null; private String BBSAuthor = null; private String BBSContent = null; private String BBSTime = null; private String BBSKeywords = null; private int BBSAgree; private int BBSDisagree; private int BBSCommentNum; private String BBSUUID = null; public String getBBSTitle() { return BBSTitle; } public void setBBSTitle(String bBSTitle) { BBSTitle = bBSTitle; } public String getBBSAuthor() { return BBSAuthor; } public void setBBSAuthor(String bBSAuthor) { BBSAuthor = bBSAuthor; } public String getBBSContent() { return BBSContent; } public void setBBSContent(String bBSContent) { BBSContent = bBSContent; } public String getBBSTime() { return BBSTime; } public void setBBSTime(String bBSTime) { BBSTime = bBSTime; } public String getBBSKeywords() { return BBSKeywords; } public void setBBSKeywords(String bBSKeywords) { BBSKeywords = bBSKeywords; } public int getBBSAgree() { return BBSAgree; } public void setBBSAgree(int bBSAgree) { BBSAgree = bBSAgree; } public int getBBSDisagree() { return BBSDisagree; } public void setBBSDisagree(int bBSDisagree) { BBSDisagree = bBSDisagree; } public int getBBSCommentNum() { return BBSCommentNum; } public void setBBSCommentNum(int bBSCommentNum) { BBSCommentNum = bBSCommentNum; } public String getBBSUUID() { return BBSUUID; } public void setBBSUUID(String bBSUUID) { BBSUUID = bBSUUID; } } 生成的代码: try { //数据库查询 ResultSet rs = dd.query(sql, count); while(rs.next()) { BBSInformation bbsInfo = new BBSInformation(); bbsInfo.setBBSUUID(rs.getString("article_uuid")); bbsInfo.setBBSAuthor("article_author"); bbsInfo.setBBSTime(rs.getDate("article_date").toString()); bbsInfo.setBBSTitle(rs.getString("article_title")); bbsInfo.setBBSContent(rs.getString("article_content")); bbsInfo.setBBSKeywords(rs.getString("article_key")); bbsInfo.setBBSAgree(rs.getInt("article_agree")); bbsInfo.setBBSDisagree(rs.getInt("article_disagree")); bbsInfo.setBBSCommentNum(rs.getInt("article_comment")); bbsInformations.add(bbsInfo); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(bbsInformations.get(0).getBBSAuthor()); /*GetBBSIformation getBBSIformation = new GetBBSIformation(); getBBSIformation.setList(bbsInformations);*/ Gson gson = new Gson(); String bbsInfoJson = new WriteJson().getJsonData(bbsInformations); System.out.println(bbsInfoJson); response.setContentType("text/xml; charset=UTF-8"); PrintWriter out = response.getWriter(); out.println(bbsInfoJson); out.flush(); out.close(); 生成的jsonString: [{"BBSAuthor":"article_author","BBSContent":"我是一只小小小鸟","BBSTime":"1994-06-17","BBSKeywords":"android,java,c语言","BBSAgree":5,"BBSDisagree":2,"BBSCommentNum":3,"BBSUUID":"254ebfed-90d2-464f-a76b-a55aed6e8fb7"}] 解析的源代码: Type listType = new TypeToken<List<BBSInformation>>(){}.getType(); Gson gson=new Gson(); List<BBSInformation> list=gson.fromJson(jsondata, listType); 生成json和解析json用的是同一个对象BBSInformation,,弄了好久啊, 就是到这里,没有返回list,求告知是什么原因?
JAVA通讯录 TXT文档分页问题
我在做一个JAVA通讯录,想请问一下如何把这个TXT文档 超过20行分页显示,请前辈们多多指教,谢谢 方便的话请帮我写一下代码看看行吗 package MyAddBook; import java.awt.Choice;//选择 import java.awt.Container;//容器 import java.awt.Frame; import java.awt.GridLayout;//间距 import java.awt.Toolkit;//居中 import java.awt.event.ActionEvent;//事件 import java.awt.event.ActionListener;//监听 import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter;//文本输出流打印对象的格式化 import java.text.Collator;//区分语言 import java.util.Arrays; import java.util.Comparator;//排序 import java.util.Scanner; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenuBar; import javax.swing.JMenu; import javax.swing.JMenuItem; import javax.swing.JOptionPane;//消息提示框 import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; public class MyAddBook { public static JFrame frame; public MyAddBook() { frame=new JFrame("通讯录");//面板标题 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//单击关闭按钮关闭窗口 frame.setVisible(true);//窗口可见 /* * 在一个窗口中,我们经常需要给窗口添加菜单条。在 Java * 中这一部分是由三个类实现的,它们是JMenuBar、JMenu和JMenuItem, 分别对应菜单条、菜单和菜单项。 * 同时,可以给JMenuItem注册侦听器,但不能对JMenuBar,JMenu注册侦听器. * * 一、菜单条(JMenuBar) * JMenuBar 的构造方法是 JMenuBar(),相当简单。在构造之后,还要将它设置成窗口的菜单条,这里要用 setJMenuBar * 方法: JMenuBar TestJMenuBar=new JMenuBar(); * TestFrame.setJMenuBar(TestJMenuBar); 需要说明的是,JMenuBar 类根据 JMenu * 添加的顺序从左到右显示,并建立整数索引。 * * 二、菜单(JMenu) 在添加完菜单条后,并不会显示任何菜单,所以还需要在菜单条中添加菜单。菜单 * JMenu 类的构造方法有4种: JMenu() 构造一个空菜单。 JMenu(Action a) * 构造一个菜单,菜单属性由相应的动作来提供。 JMenu(String s) 用给定的标志构造一个菜单。 JMenu(String * s,Boolean b) 用给定的标志构造一个菜单。如果布尔值为false,那么当释放鼠标按钮后,菜单项会消失;如果布尔值为true, * 那么当释放鼠标按钮后,菜单项仍将显示。这时的菜单称为 tearOff 菜单。 在构造完后,使用 JMenuBar 类的 add * 方法添加到菜单条中。 * * 三、菜单项(JmenuItem) 接下来的工作是往菜单中添加内容。 * 在菜单中可以添加不同的内容,可以是菜单项(JMenuItem),可以是一个子菜单,也可以是分隔符。 在构造完后,使用 JMenu 类的 * add 方法添加到菜单中。 子菜单的添加是直接将一个子菜单添加到母菜单中,而分隔符的添加只需要将分隔符作为菜单项添加到菜单中。 */ JMenuBar bar=new JMenuBar(); JMenu edit=new JMenu("编辑"); JMenuItem edit1=new JMenuItem("录入"); JMenuItem edit2=new JMenuItem("查询"); JMenuItem edit3=new JMenuItem("删除"); JMenuItem edit4=new JMenuItem("修改"); JMenuItem edit5=new JMenuItem("排序"); edit1.addActionListener(new Type());//监听 JMenu show=new JMenu("按性别显示"); JMenuItem show1=new JMenuItem("男"); JMenuItem show2=new JMenuItem("女"); Container c=frame.getContentPane(); JPanel p=new JPanel(); c.add(p); p.add(bar); bar.add(edit); bar.add(show); edit.add(edit1); edit.add(edit2); edit.add(edit3); edit.add(edit4); edit.add(edit5); show.add(show1); show.add(show2); // 获取你的屏幕的宽和高 int width = Toolkit.getDefaultToolkit().getScreenSize().width; int height = Toolkit.getDefaultToolkit().getScreenSize().height; // 然后设置你编写的窗口的初始位置,也就是在中间, frame.setLocation(width / 2 - 200, height / 2 - 150); frame.setSize(500, 300); /* * 1. JFrame是javax.swing.JFrame的类,Frame是Java.awt.Frame的类 * * 2. 关闭窗口的方式不同: * 2.1 JFrame的关闭方式:传递参数使得关闭按钮有效 * Frame的关闭方式:加监听使得关闭按钮有效 */ edit2.addActionListener(new ActionListener() // 监听查询 { public void actionPerformed(ActionEvent e) { new Operation("查询", 2).dialog.setVisible(true); } }); edit3.addActionListener(new ActionListener() // 监听删除 { public void actionPerformed(ActionEvent e) { //获取你的屏幕的宽和高 int width = Toolkit.getDefaultToolkit().getScreenSize().width; int height = Toolkit.getDefaultToolkit().getScreenSize().height; //然后设置你编写的窗口的初始位置,也就是在中间, frame.setLocation(width / 2 - 200, height / 2 - 150); new Operation("删除", 3).dialog.setVisible(true); } }); edit4.addActionListener(new ActionListener() // 监听修改 { public void actionPerformed(ActionEvent e) { new Operation("修改", 4).dialog.setVisible(true); } }); // 输出类 edit5.addActionListener(new ActionListener() // 监听排序 { public void actionPerformed(ActionEvent e) { new Print("按姓名排序后", 2);//调用 排序 函数 } }); show1.addActionListener(new ActionListener() // 监听男 { public void actionPerformed(ActionEvent e) { new Print("男", 1);//调用 匹配 显示 } }); show2.addActionListener(new ActionListener() // 监听女 { public void actionPerformed(ActionEvent e) { new Print("女", 1);//调用 匹配 显示 } }); } public static void main(String[] args) { new MyAddBook(); } public String[] getSortOfChinese(String[] a) { // Collator 类是用来执行区分语言环境,这里使用CHINA Comparator cmp = Collator.getInstance(java.util.Locale.CHINA); // JDKz自带对数组进行排序。 Arrays.sort(a, cmp); return a; } } class Operation{ private Frame frame; /* * public JDialog(Dialog owner, String title, boolean modal) * 创建一个具有指定标题、模式和指定所有者 Dialog 的对话框。 此构造方法将该组件的语言环境属性设置为 * JComponent.getDefaultLocale 所返回的值。 * * 参数: owner - 显示该对话框的所有者 Dialog; 如果此对话框没有所有者,则为 null * title -该对话框的标题栏中所显示的 String * modal - 指定对话框在显示时是否阻塞用户向其他顶层窗口输入。如果为true,则模式类型属性被设置为 DEFAULT_MODALITY_TYPE; * 否则对话框是无模式的。 * 抛出: * HeadlessException - 如果 GraphicsEnvironment.isHeadless() 返回 true。 */ JDialog dialog = new JDialog(frame, "查询对话框", true); public Operation(String str, int n) { dialog.setSize(450, 300); //获取你的屏幕的宽和高 int width = Toolkit.getDefaultToolkit().getScreenSize().width; int height = Toolkit.getDefaultToolkit().getScreenSize().height; //然后设置你编写的窗口的初始位置,也就是在中间, dialog.setLocation(width / 2 - 200, height / 2 - 150); Container c = dialog.getContentPane(); /*GridLayout(int rows, int cols, int hgap, int vgap) : 创建具有指定行数、列数以及组件水平、纵向一定间距的网格布局。*/ dialog.setLayout(new GridLayout(2, 1, 5, 5)); JLabel LOperation = new JLabel("请输入要" + str + "人员的名字"); final JTextField Tname = new JTextField(10);//单行文本输入框 JButton sure = new JButton("确定"); JButton cancel = new JButton("取消"); JPanel pane1 = new JPanel(); JPanel pane2 = new JPanel(); c.add(pane1); c.add(pane2); pane1.add(LOperation); pane1.add(Tname); pane2.add(sure); pane2.add(cancel); dialog.setDefaultCloseOperation(dialog.DISPOSE_ON_CLOSE); if (n == 2) { sure.addActionListener(new ActionListener() // 查询 { public void actionPerformed(ActionEvent e) { try { FileReader file = new FileReader("D:\\AddressBook.txt"); Scanner find = new Scanner(file); /* * 这里while括号里面的find.hasNext()方法用于判断find对象中有没有下一条数据 * 返回 bool 值 , 有则返回true 无 则返回false * 下面的find.next()是获取find对象中的值 然后赋值给 str 然后输出这个方法 * 其实就是循环输出it 对象中所有的值 */ while (find.hasNext()) { if (find.next().equals(Tname.getText())) { dialog.dispose();//关闭窗体,并释放一部分资源。 Type fd = new Type(); fd.frame = new JFrame("查询结果如下"); fd.Tname.setText(Tname.getText()); fd.Csex.select(find.next()); fd.Tunit.setText(find.next()); fd.Thomephone.setText(find.next()); fd.Temail.setText(find.next()); fd.Ttelephone.setText(find.next()); fd.Type(); } } file.close(); find.close(); } catch (FileNotFoundException e1) { // TODO Auto-generated catch block // e1.printStackTrace(); System.out.print("未找到文件"); } catch (IOException e2) { // TODO Auto-generated catch block // e2.printStackTrace(); System.out.print("未找到该人员"); } } }); } if (n == 3) { sure.addActionListener(new ActionListener() // 删除 { public void actionPerformed(ActionEvent e) { try { File file = new File("D:\\AddressBook.txt");//创建文件 Scanner find = new Scanner(file);//输入 FileWriter file1 = new FileWriter("D:\\AddressBook1.txt", true); PrintWriter write = new PrintWriter(file1); while (find.hasNext()) {//取下一个元素 String s = find.next(); if (!(s.equals(Tname.getText()))) { write.print(s + "\t"); write.print(find.next() + "\t"); write.print(find.next() + "\t\t"); write.print(find.next() + "\t\t"); write.print(find.next() + "\t\t"); write.println(find.next()); } else { find.next(); find.next(); find.next(); find.next(); find.next(); } } // file.close(); find.close(); file.delete(); write.close(); file1.close(); File file2 = new File("D:\\AddressBook1.txt"); file2.renameTo(new File("D:\\AddressBook.txt")); JOptionPane.showMessageDialog(null, "删除成功", "删 除 结 果", JOptionPane.INFORMATION_MESSAGE); } catch (FileNotFoundException e1) { // TODO Auto-generated catch block // e1.printStackTrace(); JOptionPane.showMessageDialog(null, "未找到文件"); } catch (IOException e2) { // TODO Auto-generated catch block // e2.printStackTrace(); System.out.print("未找到该人员"); } } }); } if (n == 4) { sure.addActionListener(new ActionListener() // 修改 { public void actionPerformed(ActionEvent e) { try { File file = new File("D:\\AddressBook.txt"); Scanner find = new Scanner(file); FileWriter file1 = new FileWriter("D:\\AddressBook1.txt", true); PrintWriter write = new PrintWriter(file1); while (find.hasNext()) { String s = find.next(); if (!(s.equals(Tname.getText()))) { write.print(s + "\t"); write.print(find.next() + "\t"); write.print(find.next() + "\t\t"); write.print(find.next() + "\t\t"); write.print(find.next() + "\t\t"); write.println(find.next()); } else { dialog.dispose(); Type fd = new Type(); Type.y = 1; fd.frame = new JFrame("查询结果如下"); fd.Tname.setText(Tname.getText()); String s1 = find.next(); fd.Csex.select(s1); String s2 = find.next(); fd.Tunit.setText(s2); String s5 = find.next(); fd.Thomephone.setText(s5); String s6 = find.next(); fd.Temail.setText(s6); String s7 = find.next(); fd.Ttelephone.setText(s7); fd.Type(); if (Type.z == 1) { write.print(Tname.getText() + "\t"); write.print(s1 + "\t"); write.print(s2 + "\t\t"); write.print(s5 + "\t\t"); write.print(s6 + "\t\t"); write.println(s7); Type.z = 2; } } } // file.close(); find.close(); file.delete(); write.close(); file1.close(); File file2 = new File("D:\\AddressBook1.txt"); file2.renameTo(new File("D:\\AddressBook.txt")); } catch (FileNotFoundException e1) { // TODO Auto-generated catch block // e1.printStackTrace(); System.out.print("未找到文件"); } catch (IOException e2) { // TODO Auto-generated catch block // e2.printStackTrace(); System.out.print("未找到该人员"); } } }); } cancel.addActionListener(new ActionListener() // 取消 { public void actionPerformed(ActionEvent e) { dialog.dispose();//关闭查询面板 } }); } } class Print{ public JTextArea area;// 多行文本输入框 public Print(String st, int n) { JFrame frame = new JFrame(st + "信息如下"); area = new JTextArea();// 多行文本输入框 frame.add(area); frame.setVisible(true); frame.setSize(1000, 500); frame.setLocation(350, 150);// 显示位置坐标 if (n == 2) try // 排序 { int i, j, k; String[] all; all = new String[1000]; BufferedReader read = new BufferedReader(new FileReader("D:\\AddressBook.txt")); area.append("姓 名" + "\t" + "性别" + "\t" + "单位" + "\t\t" + "住宅电话" + "\t\t" + "Email" + "\t\t\t" + "移动电话" + '\n'); int z = 1, count = 0; while (z == 1) { for (i = 0; i < 1000; i++) { String str = read.readLine(); if (str != null) { all[i] = str; count++; } else z = 0; } } String[] bll; bll = new String[count]; for (i = 0; i < count; i++) bll[i] = all[i]; getSortOfChinese(bll);// 调用排序函数 for (i = 0; i < count; i++) area.append(bll[i] + '\n');// 在指定元素的结尾追加内容 read.close(); } catch (FileNotFoundException e1) { e1.printStackTrace(); } catch (IOException e2) { e2.printStackTrace(); } if (n == 1) try // 指定类人员 { FileReader file = new FileReader("D:\\AddressBook.txt"); Scanner find = new Scanner(file); area.append("姓 名" + "\t" + "性别" + "\t" + "单位" + "\t\t" + "住宅电话" + "\t\t" + "Email" + "\t\t\t" + "移动电话" + '\n'); while (find.hasNext()) { String str1 = find.next(); String str2 = find.next(); if (str2.equals(st)) { area.append(str1 + "\t"); area.append(str2 + "\t"); area.append(find.next() + "\t\t"); area.append(find.next() + "\t\t"); area.append(find.next() + "\t\t"); area.append(find.next() + '\n'); } else { find.next(); find.next(); find.next(); find.next(); } } file.close(); find.close(); } catch (FileNotFoundException e1) { e1.printStackTrace(); } catch (IOException e2) { e2.printStackTrace(); } } private void getSortOfChinese(String[] bll) { // TODO Auto-generated method stub } } class Type implements ActionListener { public static int z = 2; public static int y = 0; public JLabel Lname, Lsex, Lunit, Lhomephone, Lemail, Ltelephone, Lnote;//添加标签 public JTextField Tname = new JTextField(15), Thomephone = new JTextField(25), Temail = new JTextField(25),Ttelephone = new JTextField(25), Tunit = new JTextField(25); public Choice Csex = new Choice();//创建文本框 public JButton sure, cancel;//添加“确定”“取消”按钮 public JFrame frame = new JFrame("录入联系人信息");//面板标题 public Type() { Csex.addItem("男");//给列表框或组合框等具有列表的对象添加项目 Csex.addItem("女"); } public void Type() { Container c = frame.getContentPane();//创建容器 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//单击窗口的关闭按钮时程序执行的操作 frame.setSize(800, 400);//窗口大小 frame.setLayout(new GridLayout(7, 2, 7, 7));//设置用户界面上的屏幕组件的格式布局 frame.setVisible(true);//设置面板可见 //获取你的屏幕的宽和高 int width = Toolkit.getDefaultToolkit().getScreenSize().width; int height = Toolkit.getDefaultToolkit().getScreenSize().height; //然后设置你编写的窗口的初始位置,也就是在中间, frame.setLocation(width / 2 - 200, height / 2 - 150); Lname = new JLabel("姓名");//标签 Lsex = new JLabel("性别"); Lunit = new JLabel("单位"); Lhomephone = new JLabel("住宅电话"); Lemail = new JLabel("Email"); Ltelephone = new JLabel("移动电话"); sure = new JButton("确定"); cancel = new JButton("取消"); JPanel pane1 = new JPanel();//添加面板 JPanel pane2 = new JPanel(); JPanel pane3 = new JPanel(); JPanel pane5 = new JPanel(); c.add(pane1);//将面板添加到容器中 c.add(pane2); c.add(pane3); c.add(pane5); pane1.add(Lname);//将标签添加到面板 pane1.add(Tname); pane1.add(Lsex); pane1.add(Csex); pane2.add(Lunit); pane2.add(Tunit); pane2.add(Lhomephone); pane2.add(Thomephone); pane3.add(Lemail); pane3.add(Temail); pane3.add(Ltelephone); pane3.add(Ttelephone); pane5.add(sure); pane5.add(cancel); sure.addActionListener(new ActionListener() // 设置监听器 { public void actionPerformed(ActionEvent e) // 用匿名内部类实现监听器 { if (Tname.getText().equals(""))//输入的姓名是否为空 /* * 显示一个错误对话框,该对话框显示的 message 为 'alert': * JOptionPane.showMessageDialog(null, "alert", * "alert", JOptionPane.ERROR_MESSAGE); */ JOptionPane.showMessageDialog(null, "录入失败姓名必须填写", "录入结果", JOptionPane.INFORMATION_MESSAGE); else { try { FileWriter AddressBook = new FileWriter("D:\\AddressBook.txt", true);//写入文件 PrintWriter add = new PrintWriter(AddressBook); String s1, s2, s3,s4; if (Tunit.getText().equals(""))//未输入数据 s1 = "无"; else s1 = Tunit.getText(); if (Thomephone.getText().equals("")) s2 = "无"; else s2 = Thomephone.getText(); if (Temail.getText().equals("")) s3 = "无"; else s3 = Temail.getText(); if (Ttelephone.getText().equals("")) s4 = "无"; else s4 = Ttelephone.getText(); add.println(Tname.getText()+ "\t" + Csex.getSelectedItem() + "\t" + s1 + "\t\t" + s2 + "\t\t" + s3 + "\t\t" + s4); add.close(); AddressBook.close(); z = 1; } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } if (y == 0) { JOptionPane.showMessageDialog(null, "录入成功", "录入结果", JOptionPane.INFORMATION_MESSAGE); } else { JOptionPane.showMessageDialog(null, "修改成功", "修改结果", JOptionPane.INFORMATION_MESSAGE); } Tname.setText(""); //删除时传入空白串 Tunit.setText(""); Thomephone.setText(""); Temail.setText(""); Ttelephone.setText(""); } } }); cancel.addActionListener(new ActionListener() // 设置监听器 { public void actionPerformed(ActionEvent e) // 用匿名内部类实现监听器 { frame.dispose();//关闭面板 z = 0; } }); } public void actionPerformed(ActionEvent e) { new Type().Type(); } }
加入新代码后提示“value”为空或不是对象
以前有个完整版的。我想修改下,加了点东西但是不能用了。 [code="java"]<%@ page contentType="text/html; charset=utf-8" %> <%@ page import="java.sql.*"%> <%@page import="java.text.SimpleDateFormat"%> <%@page import="java.util.StringTokenizer"%> <% request.setCharacterEncoding("UTF-8"); //String tmp = new String(request.getParameter("tmp").getBytes("ISO-8859-1"),"utf-8") ; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String systime = sdf.format(new java.util.Date()); String tmp = request.getParameter("tmp"); StringTokenizer st = null; StringTokenizer st2 = null; if(tmp != null){ tmp = new String(tmp.getBytes("ISO-8859-1"),"UTF-8"); st = new StringTokenizer(tmp,"|"); st2 = new StringTokenizer(tmp,"|"); } Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); String url="jdbc:oracle:thin:@localhost:1521:ORCL"; //orcl为你的数据库的SID String user="boo"; String password="boo"; String leixing[] = {"nothing","矿粉石料室","焦炭室","焦煤室","喷吹煤室","合金室"};//更改部分 String pinzhong[] = {"nothing","国内矿粉(炼铁)","竖炉球(炼铁)","竖炉球(青龙自产)","锰矿","钛矿","石灰石粉","白云石粉","白灰面","石灰石","轻烧白云石","石灰","精炼萤石","白云石渣","硅灰石","外购焦炭","主焦煤","肥煤","1/3焦煤","瘦煤","洗精煤合计","喷吹白煤","喷吹烟煤","烧结煤","硅锰合金","高碳锰铁","硅铁","锌锭","其他合金","生铁"};//更改部分 String yuefen[] = {"nothing","1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"}; if(st!= null){ Connection conn= DriverManager.getConnection(url,user,password); Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); // 删除 st2.nextToken(); st2.nextToken(); st2.nextToken(); String month = yuefen[Integer.parseInt(st2.nextToken())]; String year = st2.nextToken(); String sql2 = "delete from steelanalysis where nianfen='"+year+"' and yuefen='"+month+"'"; System.out.println(sql2); stmt.execute(sql2); // 添加 String sql="insert into steelanalysis(submittime,leixing,pinzhong,yuefen,nianfen,jihua,junjia,jine) values('"+st.nextToken()+"','"+leixing[Integer.parseInt(st.nextToken())]+"','"+pinzhong[Integer.parseInt(st.nextToken())]+"','"+yuefen[Integer.parseInt(st.nextToken())]+"','"+st.nextToken()+"','"+st.nextToken()+"','"+st.nextToken()+"','"+st.nextToken()+"')";//添加部分为junjia,jine System.out.println(sql); ResultSet rs=stmt.executeQuery(sql); stmt.execute("commit"); rs.close(); stmt.close(); conn.close(); } %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>My JSP 'index.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <script type="text/javascript"> function doSubmit(){ var liexing = getSelectValue('leixing'); var pinzhong = getSelectValue('pinzhong'); var yuefen = getSelectValue('yuefen'); var nianfen = getSelectValue('nianfen'); var jihua = document.getElementById("jihua").value;//添加部分 var junjia = document.getElementById("junjia").value;//添加部分 var jine = document.getElementById("jine").value; var systime=document.getElementById("systime").value; var tmp = systime+'|'+liexing+'|'+pinzhong+'|'+yuefen+'|'+nianfen+'|'+jihua+'|'+junjia+'|'+jine;//添加部分junjia,jine document.submitform.action="steelanalysis.jsp?tmp="+tmp; if(confirm("确认提交吗?")){ alert('提交完毕'); document.submitform.submit(); } } function getSelectValue(id){ var _selObj=document.getElementById(id);//取下拉框的元素 var _selVal=_selObj[_selObj.selectedIndex].value;//取下拉框被选中的值 return _selVal; } </script> </head> <body> <br/> <table align="center"> <tr> <td> 类型 </td> <td> <select style="width:100px" id="leixing"> <option value="1">矿粉石料室</option> <option value="2">焦炭室</option> <option value="3">焦煤室</option> <option value="4">喷吹煤室</option> <option value="5">合金室</option> </select> </td> </tr> <tr> <td> 品种 </td> <td> <select style="width:100px" id="pinzhong"> <option value="1">国内矿粉(炼铁)</option> <option value="2">竖炉球(炼铁)</option> <option value="3">竖炉球(青龙自产)</option> <option value="4">锰矿</option> <option value="5">钛矿</option> <option value="6">石灰石粉</option> <option value="7">白云石粉</option> <option value="8">白灰面</option> <option value="9">石灰石</option> <option value="10">轻烧白云石</option> <option value="11">石灰</option> <option value="12">精炼萤石</option> <option value="13">白云石渣</option> <option value="14">硅灰石</option> <option value="15">外购焦炭</option> <option value="16">主焦煤</option> <option value="17">肥煤</option> <option value="18">1/3焦煤</option> <option value="19">瘦煤</option> <option value="20">洗精煤合计</option> <option value="21">喷吹白煤</option> <option value="22">喷吹烟煤</option> <option value="23">烧结煤</option> <option value="24">硅锰合金</option> <option value="25">高碳锰铁</option> <option value="26">硅铁</option> <option value="27">锌锭</option> <option value="28">其他合金</option> <option value="29">生铁</option> </select> </td> </tr> <tr> <td> 月份 </td> <td> <select style="width:100px" id="yuefen"> <option value="1">1月</option> <option value="2">2月</option> <option value="3">3月</option> <option value="4">4月</option> <option value="5">5月</option> <option value="6">6月</option> <option value="7">7月</option> <option value="8">8月</option> <option value="9">9月</option> <option value="10">10月</option> <option value="11">11月</option> <option value="12">12月</option> </select> </td> </tr> <tr> <td> 年份 </td> <td> <input type="text" id="nianfen" /> </td> </tr> <tr> <td> 计划值 </td> <td> <input type="text" id="jihua" /> </td> </tr> <tr> <td> 平均价 </td> <td> <input type="text" id="junjia" /> </td> </tr> <tr> <td> 计划值金额 </td> <td> <input type="text" id="jine" /> </td> </tr> <tr> <td colspan="4" align="center"> <br/> <button id="submit" onclick="doSubmit();">提交</button> </td> </tr> </table> </body> <input type="hidden" id="systime" value="<%=systime %>" /> <form id="submitform" name="submitform" method="post"> <input type="hidden" id="tmp" value="tmp" /> </form> </html> [/code] 报错的是 [img]http://dl.iteye.com/upload/attachment/446965/b5c72f7e-d37f-39a7-a8ef-2a3e02b2f25b.jpg[/img] 本人菜鸟,才学这么。看了代码只知道html部分没错。JS不懂。所以也就不知道了。 页面打开正常。但是一点提交就报错了。请大家看下。。最好给点注释。讲下。里面的结构。如果想改的话就好弄些了。。
struts2中Action怎样获取动态表单中的多行数据
<div class="iteye-blog-content-contain"> <p style="font-size: 14px;"><span style="color: #333333; font-family: 宋体;"> 一: struts-config.xml 配置</span></p> <pre name="code" class="xml">&lt;struts-config&gt;   &lt;form-beans&gt;     &lt;form-bean name="trafficForm" type="com.ccit.safetm.controller.traffic.TrafficForm"&gt;&lt;/form-bean&gt;   &lt;/form-beans&gt;   &lt;action-mappings&gt;     &lt;action path="/traffic/addTraPolicy" type="com.ccit.safetm.controller.traffic.AddTraPolicyAction" name="trafficForm" scope="request"&gt; &lt;forward name="success" path="/jsp/success.jsp"&gt;&lt;/forward&gt; &lt;forward name="error" path="/jsp/error.jsp"&gt;&lt;/forward&gt; &lt;/action&gt;   &lt;/action-mappings&gt; &lt;/struts-config&gt; <span style="color: #333333; font-family: 宋体;">二: 输入页面 </span><span style="color: #333333; font-family: 宋体;"><span style="color: #333333; font-family: 宋体;">add_traffic_policy.jsp <img src="http://dl2.iteye.com/upload/attachment/0097/0583/e2343c9c-9e2f-3a3d-9fb5-208404a74116.jpg" alt="">  </span></span></pre> <pre name="code" class="java">&lt;%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8" isELIgnored="false"%&gt; &lt;%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean"%&gt; &lt;%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%&gt; &lt;%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic"%&gt; &lt;%@ taglib uri="http://struts.apache.org/tags-tiles" prefix="tiles"%&gt; &lt;%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%&gt; &lt;% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %&gt; &lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt; &lt;html xmlns="http://www.w3.org/1999/xhtml"&gt; &lt;head&gt; &lt;base href="&lt;%=basePath%&gt;" /&gt; &lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8" /&gt; &lt;title&gt;添加流量监控策略&lt;/title&gt; &lt;link href="&lt;%=request.getContextPath()%&gt;/css/css_blue.css" rel="stylesheet" type="text/css" id="cssStyle" /&gt; &lt;script type="text/javascript" src="&lt;%=request.getContextPath()%&gt;/js/judge.js"&gt;&lt;/script&gt; &lt;script type="text/javascript" src="&lt;%=request.getContextPath()%&gt;/js/jquery-1.2.6.js"&gt;&lt;/script&gt; &lt;script type="text/javascript" src="&lt;%=request.getContextPath()%&gt;/js/jquery-1.3.2.min.js"&gt;&lt;/script&gt; &lt;script type="text/javascript" src="&lt;%=request.getContextPath()%&gt;/js/jquery.cookie.js"&gt;&lt;/script&gt; &lt;script type="text/javascript"&gt; $(document).ready(function() { $('#btnAdd').click(function() { var num = $('.clonedInput').length; // how many "duplicatable" input fields we currently have var newNum = new Number(num + 1); // the numeric ID of the new input field being added // create the new element via clone(), and manipulate it's ID using newNum value var newElem = $('#input' + num).clone().attr('id', 'input' + newNum); // manipulate the name/id values of the input inside the new element // newElem.children(':first').attr('id', 'name' + newNum).attr('name', 'name' + newNum); newElem.children(':first').attr('id', 'user['+ newNum + ']day' ).attr('name', 'user['+ newNum + ']day' ); newElem.children(':next').attr('id', 'user['+ newNum + ']per' ).attr('name', 'user['+ newNum + ']per' ); newElem.children(':last').attr('id', 'user['+ newNum + ']content' ).attr('name', 'user['+ newNum + ']content' ); // insert the new element after the last "duplicatable" input field $('#input' + num).after(newElem); // enable the "remove" button $('#btnDel').attr('disabled',''); // business rule: you can only add 5 names if (newNum == 5) $('#btnAdd').attr('disabled','disabled'); }); $('#btnDel').click(function() { var num = $('.clonedInput').length; // how many "duplicatable" input fields we currently have $('#input' + num).remove(); // remove the last element // enable the "add" button $('#btnAdd').attr('disabled',''); // if only one element remains, disable the "remove" button if (num-1 == 1) $('#btnDel').attr('disabled','disabled'); }); $('#btnDel').attr('disabled','disabled'); }); &lt;/script&gt; &lt;/head&gt; &lt;body class="main_bg"&gt; &lt;html:form method="post" action="/traffic/addTraPolicy.do"&gt; &lt;table width="90%" border="0" align="center" cellpadding="0" cellspacing="0"&gt; &lt;tr&gt; &lt;td width="1%" height="33" background="&lt;%=request.getContextPath()%&gt;/images/main_02.gif"&gt; &lt;img src="&lt;%=request.getContextPath()%&gt;/images/main_01.gif" width="9" height="33" /&gt; &lt;/td&gt; &lt;td width="3%" height="33" background="&lt;%=request.getContextPath()%&gt;/images/main_02.gif"&gt; &lt;img src="&lt;%=request.getContextPath()%&gt;/images/main_03.gif" width="18" height="17" /&gt; &lt;/td&gt; &lt;td width="96%" background="&lt;%=request.getContextPath()%&gt;/images/main_02.gif" class="text10"&gt; 添加流量监控策略 &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;br /&gt; &lt;table class="admintable" width="90%" border="0" align="center" cellpadding="4" cellspacing="0" bgcolor="#cde6f6"&gt; &lt;tr&gt; &lt;td&gt; &lt;div id="input1" style="margin-bottom:4px;" class="clonedInput"&gt; 提醒日: &lt;input type="text" name="traffics[0].checkDay" id="traffics[0].checkDay" /&gt; 提醒百分比: &lt;input type="text" name="traffics[0].warnPercent" id="traffics[0].warnPercent" /&gt; 推送消息内容: &lt;input type="text" name="traffics[0].warnContent" id="traffics[0].warnContent" /&gt; &lt;/div&gt; &lt;/td&gt; &lt;td&gt; &lt;div&gt; &lt;input type="button" id="btnAdd" value="添加策略" /&gt; &lt;input type="button" id="btnDel" value="移除策略" /&gt; &lt;/div&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td height="25" colspan="4" align="center" bgcolor="#FFFFFF"&gt; &lt;input type="submit" value="提交" /&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; &lt;/html:form&gt; &lt;/body&gt; &lt;/html&gt; </pre> <pre name="code" class="xml"><span style="color: #333333; font-family: 宋体;"><span style="color: #333333; font-family: 宋体;">  </span></span></pre> <p style="font-size: 14px;"><span style="color: #333333; font-family: 宋体;"> </span></p> <p style="font-size: 14px;"><span style="color: #333333; font-family: 宋体;">三: TrafficForm的关键代码</span></p> <p style="font-size: 14px;"><span style="color: #333333; font-family: 宋体;"></span></p> <pre name="code" class="java">public class TrafficForm extends BaseActionForm implements Serializable { private static final long serialVersionUID = 454397279205151336L; private List traffics = new AutoArrayList(Traffic.class); public List getTraffics() { return traffics; } public void setTraffics(List traffics) { this.traffics.clear(); this.traffics.addAll(traffics); } }</pre> <p style="font-size: 14px;"><span style="color: #333333; font-family: 宋体;"> </span></p> <p style="font-size: 14px;"><span style="color: #333333; font-family: 宋体;">四.bean,</span><span style="color: #333333; font-family: 宋体;">提问页面省略了get set方法</span></p> <p style="text-indent: 28px;"><span style="color: #333333; font-family: 宋体;"><span style="color: #333333; font-family: 宋体;"></span></span></p> <pre name="code" class="java">public class Traffic extends BaseActionForm implements Serializable { private static final long serialVersionUID = 454397279205151336L; /** * Fields */ private Integer policyId; private Integer checkDay; private Integer warnPercent; private String warnContent; /** default constructor */ public Traffic() { } /** full constructor */ public Traffic(Integer policyId, Integer checkDay, Integer warnPercent, String warnContent) { super(); this.policyId = policyId; this.checkDay = checkDay; this.warnPercent = warnPercent; this.warnContent = warnContent; }</pre> <p style="text-indent: 28px;"><span style="color: #333333; font-family: 宋体;"><span style="color: #333333; font-family: 宋体;">       </span></span></p> <p style="text-indent: 28px;"><span style="color: #333333; font-family: 宋体;"><span style="color: #333333; font-family: 宋体;">五.</span></span><span style="color: #333333; font-family: 宋体;"> </span><span style="color: #333333; font-family: 宋体;">自定义的 AutoArrayList</span></p> <p style="text-indent: 28px;"><span style="color: #333333; font-family: 宋体;"></span></p> <pre name="code" class="java">public class AutoArrayList extends ArrayList implements Serializable { private static final long serialVersionUID = 1L; private Class itemClass; public AutoArrayList(Class itemClass){ this.itemClass = itemClass; } public Object get(int index){ try { while(index &gt;= size()){ add(itemClass.newInstance()); } } catch (Exception e) { e.printStackTrace(); } return super.get(index); } }</pre> <p style="text-indent: 28px;"><span style="color: #333333; font-family: 宋体;"> </span></p> <p style="text-indent: 28px;"><span style="color: #333333; font-family: 宋体;">六.</span><span style="color: #333333; font-family: 宋体;"><span style="color: #333333; font-family: 宋体;">AddTraPolicyAction</span></span></p> <p style="text-indent: 28px;"><span><span></span></span></p> <pre name="code" class="java">TrafficForm trafficForm = (TrafficForm)form; List traffics = trafficForm.getTraffics(); System.out.println("traffics.size():"+traffics.size()); for (int i = 0; i &lt; traffics.size(); i++) { Traffic traffic = (Traffic) traffics.get(i); System.out.println("Traffic["+i+"]CheckDay:"+traffic.getcheckDay()+" WarnPercent:"+traffic.getWarnPercent()+" WarnContent:"+traffic.getWarnContent()); } // Integer checkDay = trafficForm.getcheckDay(); // Integer warnPercent = trafficForm.getWarnPercent(); // String warnContent = trafficForm.getWarnContent(); // System.out.println("checkDay:"+checkDay); // System.out.println("warnPercent:"+warnPercent); // System.out.println("warnContent:"+warnContent); // // String[] days = request.getParameterValues("day"); // String[] pers = request.getParameterValues("per"); // String[] contents = request.getParameterValues("content"); // System.out.println("测试day数组元素个数"+days.length); // System.out.println("测试pers数组元素个数"+pers.length); // System.out.println("测试contents数组元素个数"+contents.length); // while(request.getParameterNames().hasMoreElements()){ // String day=(String)request.getParameterNames().nextElement(); // String value=request.getParameter(day); // System.out.println("测试name:"+day+",它的值是:"+value); // }</pre> <p style="text-indent: 28px;"><span><span><span style="color: #333333; font-family: 宋体;"> </span></span></span></p> <p style="text-indent: 28px;"><span style="color: #333333; font-family: 宋体;"><span style="color: #333333; font-family: 宋体;">在action中测试,试过</span></span><span style="color: #333333; font-family: 宋体;">traffics的size总是1,</span><span style="color: #333333; font-family: 宋体;">总是只能获取表格中的第一行数据。也试过</span><span style="color: #333333; font-family: 宋体;">request.getParameterValues依然取不到其他行的数据,</span><span style="color: #333333; font-family: 宋体;">求解哪里有问题呢?附上我参考的页面</span></p> <p style="text-indent: 28px;"><span style="color: #333333; font-family: 宋体;"><a href="http://tech.ddvip.com/2008-12/122881555798671_2.html">http://tech.ddvip.com/2008-12/122881555798671_2.html</a></span></p> <p style="text-indent: 28px;"> </p> </div>
关于list的动态删除操作,报异常 ,求解
<p>这样写代码会报错</p> <p> </p> <pre name="code" class="java"> List&lt;String&gt; list = new ArrayList&lt;String&gt;(); list.add("a"); list.add("b"); list.add("c"); list.add("d"); Iterator&lt;String&gt; iterator = list.iterator(); while(iterator.hasNext()){ // String s = iterator.next(); // System.out.println(iterator.next()); iterator.remove(); } System.out.println(list.size());</pre> <p> 这样不报错</p> <p> </p> <div class="quote_title"> 写道</div> <div class="quote_div"> List&lt;String&gt; list = new ArrayList&lt;String&gt;();<br> list.add("a");<br> list.add("b");<br> list.add("c");<br> list.add("d");<br> Iterator&lt;String&gt; iterator = list.iterator();<br> while(iterator.hasNext()){<br> String s = iterator.next();<br> iterator.remove();<br> }<br> System.out.println(list.size());</div> <p> 这样也不报错</p> <p> </p> <div class="quote_title"> 写道</div> <div class="quote_div"> List&lt;String&gt; list = new ArrayList&lt;String&gt;();<br> list.add("a");<br> list.add("b");<br> list.add("c");<br> list.add("d");<br> Iterator&lt;String&gt; iterator = list.iterator();<br> while(iterator.hasNext()){<br><br> System.out.println(iterator.next());<br> iterator.remove();<br> }<br> System.out.println(list.size());</div>  这是为什么了,求解<br/><strong>问题补充</strong><br/><div class="quote_title">magicyyao 写道</div><div class="quote_div">你换成Iterable应该就可以</div> <br />我用的就是这个啊<img src="/images/smiles/icon_cry.gif"/>
爬虫福利二 之 妹子图网MM批量下载
爬虫福利一:27报网MM批量下载    点击 看了本文,相信大家对爬虫一定会产生强烈的兴趣,激励自己去学习爬虫,在这里提前祝:大家学有所成! 目标网站:妹子图网 环境:Python3.x 相关第三方模块:requests、beautifulsoup4 Re:各位在测试时只需要将代码里的变量 path 指定为你当前系统要保存的路径,使用 python xxx.py 或IDE运行即可。
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、PDF搜索网站推荐 对于大部
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 顺便拉下票,我在参加csdn博客之星竞选,欢迎投票支持,每个QQ或者微信每天都可以投5票,扫二维码即可,http://m234140.nofollow.ax.
Vue + Spring Boot 项目实战(十四):用户认证方案与完善的访问拦截
本篇文章主要讲解 token、session 等用户认证方案的区别并分析常见误区,以及如何通过前后端的配合实现完善的访问拦截,为下一步权限控制的实现打下基础。
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入  假设现有4个人
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 欢迎 改进 留言。 演示地点跳到演示地点 html代码如下`&lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;title&gt;music&lt;/title&gt; &lt;meta charset="utf-8"&gt
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。 1. for - else 什么?不是 if 和 else 才
数据库优化 - SQL优化
前面一篇文章从实例的角度进行数据库优化,通过配置一些参数让数据库性能达到最优。但是一些“不好”的SQL也会导致数据库查询变慢,影响业务流程。本文从SQL角度进行数据库优化,提升SQL运行效率。 判断问题SQL 判断SQL是否有问题时可以通过两个表象进行判断: 系统级别表象 CPU消耗严重 IO等待严重 页面响应时间过长
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 c/c++ 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7
通俗易懂地给女朋友讲:线程池的内部原理
餐厅的约会 餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”我楞了一下,心里想女朋友今天是怎么了,怎么突然问出这么专业的问题,但做为一个专业人士在女朋友面前也不能露怯啊,想了一下便说:“我先给你讲讲我前同事老王的故事吧!” 大龄程序员老王 老王是一个已经北漂十多年的程序员,岁数大了,加班加不动了,升迁也无望,于是拿着手里
经典算法(5)杨辉三角
写在前面: 我是 扬帆向海,这个昵称来源于我的名字以及女朋友的名字。我热爱技术、热爱开源、热爱编程。技术是开源的、知识是共享的。 这博客是对自己学习的一点点总结及记录,如果您对 Java、算法 感兴趣,可以关注我的动态,我们一起学习。 用知识改变命运,让我们的家人过上更好的生活。 目录一、杨辉三角的介绍二、杨辉三角的算法思想三、代码实现1.第一种写法2.第二种写法 一、杨辉三角的介绍 百度
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹
面试官:你连RESTful都不知道我怎么敢要你?
面试官:了解RESTful吗? 我:听说过。 面试官:那什么是RESTful? 我:就是用起来很规范,挺好的 面试官:是RESTful挺好的,还是自我感觉挺好的 我:都挺好的。 面试官:… 把门关上。 我:… 要干嘛?先关上再说。 面试官:我说出去把门关上。 我:what ?,夺门而去 文章目录01 前言02 RESTful的来源03 RESTful6大原则1. C-S架构2. 无状态3.统一的接
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看
SQL-小白最佳入门sql查询一
一 说明 如果是初学者,建议去网上寻找安装Mysql的文章安装,以及使用navicat连接数据库,以后的示例基本是使用mysql数据库管理系统; 二 准备前提 需要建立一张学生表,列分别是id,名称,年龄,学生信息;本示例中文章篇幅原因SQL注释略; 建表语句: CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, `
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // dosho
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,
程序员:我终于知道post和get的区别
IT界知名的程序员曾说:对于那些月薪三万以下,自称IT工程师的码农们,其实我们从来没有把他们归为我们IT工程师的队伍。他们虽然总是以IT工程师自居,但只是他们一厢情愿罢了。 此话一出,不知激起了多少(码农)程序员的愤怒,却又无可奈何,于是码农问程序员。 码农:你知道get和post请求到底有什么区别? 程序员:你看这篇就知道了。 码农:你月薪三万了? 程序员:嗯。 码农:你是怎么做到的? 程序员:
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
      11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员
Android 9.0系统新特性,对刘海屏设备进行适配
其实Android 9.0系统已经是去年推出的“老”系统了,这个系统中新增了一个比较重要的特性,就是对刘海屏设备进行了支持。一直以来我也都有打算针对这个新特性好好地写一篇文章,但是为什么直到拖到了Android 10.0系统都发布了才开始写这篇文章呢?当然,一是因为我这段时间确实比较忙,今年几乎绝大部分的业余时间都放到写新书上了。但是最主要的原因并不是这个,而是因为刘海屏设备的适配存在一定的特殊性
网易云6亿用户音乐推荐算法
网易云音乐是音乐爱好者的集聚地,云音乐推荐系统致力于通过 AI 算法的落地,实现用户千人千面的个性化推荐,为用户带来不一样的听歌体验。 本次分享重点介绍 AI 算法在音乐推荐中的应用实践,以及在算法落地过程中遇到的挑战和解决方案。 将从如下两个部分展开: AI 算法在音乐推荐中的应用 音乐场景下的 AI 思考 从 2013 年 4 月正式上线至今,网易云音乐平台持续提供着:乐屏社区、UGC
【技巧总结】位运算装逼指南
位算法的效率有多快我就不说,不信你可以去用 10 亿个数据模拟一下,今天给大家讲一讲位运算的一些经典例子。不过,最重要的不是看懂了这些例子就好,而是要在以后多去运用位运算这些技巧,当然,采用位运算,也是可以装逼的,不信,你往下看。我会从最简单的讲起,一道比一道难度递增,不过居然是讲技巧,那么也不会太难,相信你分分钟看懂。 判断奇偶数 判断一个数是基于还是偶数,相信很多人都做过,一般的做法的代码如下
日均350000亿接入量,腾讯TubeMQ性能超过Kafka
整理 | 夕颜出品 | AI科技大本营(ID:rgznai100) 【导读】近日,腾讯开源动作不断,相继开源了分布式消息中间件TubeMQ,基于最主流的 OpenJDK8开发的
8年经验面试官详解 Java 面试秘诀
    作者 | 胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。   Java程序员准备和投递简历的实
面试官如何考察你的思维方式?
1.两种思维方式在求职面试中,经常会考察这种问题:北京有多少量特斯拉汽车? 某胡同口的煎饼摊一年能卖出多少个煎饼? 深圳有多少个产品经理? 一辆公交车里能装下多少个乒乓球? 一
相关热词 c# 输入ip c# 乱码 报表 c#选择结构应用基本算法 c# 收到udp包后回包 c#oracle 头文件 c# 序列化对象 自定义 c# tcp 心跳 c# ice连接服务端 c# md5 解密 c# 文字导航控件
立即提问