回复 3楼 Ocean1
是你的打开方式不对(或者是我没理解你的循环的意思)
程序代码:
#include<stdio.h>
#include<string.h>
void sort(char a[],int n) {
int i,j;
char temp;
for( i=0; i < n-1; i++) {
for( j=i+1; j<n; j++) {
if(a[i] > a[j]) {
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
}
int BinSearch(char a[],char ch,int n) {
int low,high,mid;
low = 0;
high = n-1;
while(low <= high) {
mid= low +(high-low)/2;
printf("%d ",mid);
if(ch > a[mid])
low = mid+1;
else if(ch < a[mid])
high = mid-1;
else
return mid;
}
return -1;
}
int main() {
char a[80];
char ch;
int k=0;
do {
// fgets(a,80,stdin);/*fgets()函数一次读一行数据,不能实现读到空格就停止,需要用scanf*/
scanf("%s",a);
scanf(" %c",&ch);/*读完字符串a后缓存中还有一个空白符,为避免他被ch读到所以在%c留了一个空格*/
sort(a,strlen(a));
printf("{") ;
k=BinSearch(a,ch,strlen(a));
printf("}");
if( k != -1)
printf("找到了,在第%d个\n",k);
else
printf("没找到\n");
} while(getchar()!='\n');/*输入ch之后不能用回车,否则程序将认定输入终止,结束循环*/
return 0;
}
测试输入:
123456
(空格或回车或制表符)0
(任何不是回车的符号)123456
(空格或回车或制表符)1
(任何不是回车的符号)123456
(空格或回车或制表符)0
(回车)
[local]1[/local]
顺便解释一下,输出的“第几个”是经过sort()函数排序的,已经不是所查询的字符在原字符串中的位置了!。。
我写的循环仅仅能实现让你每次第一个字符串和一个字符,问询该字符是否是该字符串的一个子集。结束循环的标志就是那最后的一个'\n'
如果你希望程序开始的时候读一个字符串,然后不断读字符分别判断每一个字符是否是字符串的子集。那么修改main()如下
程序代码:
int main() {
char a[80];
char ch;
int k=0;
scanf("%s",a);
sort(a,strlen(a));
do {
scanf(" %c",&ch);/*读完字符串a后缓存中还有一个空白符,为避免他被ch读到所以在%c留了一个空格*/
printf("{") ;
k=BinSearch(a,ch,strlen(a));
printf("}");
if( k != -1)
printf("找到了,在第%d个\n",k);
else
printf("没找到\n");
} while(getchar()!='\n');/*输入ch之后不能用回车,否则程序将认定输入终止,结束循环*/
return 0;
}