高手们,帮帮我啊...这个C题目:

xbdarling 2008-06-18 09:23:04
编写一个函数,返回给定的字符在某个字符串中第一次出现的位置,如果不存在,则函数返回值为-1,并编写主程序调用该函数,要求能对用户输入的任意多个字符进行查找,要求用指针完成.我是这样做的
#include<stdio.h>
#include<stdlib.h>
char Search(char a[],int n,char m);
main()
{
char *p=NULL,m;
int pos,i=0,n;
printf("Please enter array size:");
scanf("%d",&n);
p=(char *)calloc(n,sizeof(char));
if(p==NULL)
{
printf("No enough memory!\n");
exit(0);
}
printf("Please enter a string:");
scanf("%s",p);
printf("请输入要查找的字符:");
scanf("%c",&m);
pos=Search(p,n,m);
if(pos=-1)
{
printf("给定的字符在字符串中不存在!\n");
}
else
{
printf("pos=%d\n",i);
}
}
char Search(char a[],int n,char m)
{
int i=0;
if(a[i]==m)
{
return 0;
}
else
{
return -1;
}
}
没有error和warning,可是就是无法实现,调试了好多次还是无果,唉...
...全文
208 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
fangbing007 2008-06-22
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>
#define SIZE 20
char Search(char a[],int n,char m);
main()
{
char *p=NULL,*m;//这里M改成了指针
int pos,i=0,n;//N改成了要查找的字符长度
p=(char *)calloc(n,sizeof(char));
if(p==NULL) {
printf("No enough memory!\n");
exit(0);
}
printf("Please enter a string:");
scanf("%s",p);
printf("请输入要查找的字符:");
scanf("%s",m);
n=strlen(m);//得到输入字符长度
pos=Search(p,n,m);//P.M都为指针
if(pos=-1) {
printf("给定的字符在字符串中不存在!\n");
}
else {
printf("pos=%d\n",i);
}
}



char Search(char *p,int n,char *m)//N为M字符串长度
{
int i;
char *p1,b[SIZE];
while(*p)//判断*P是否是'\0'
{
p1=p;
i=0;
while(b[i++]=*p1++&&i<SIZE);//给B[I]赋值
b[n+1]='\0';//将第N位设置为\0,方便下面比较

if(strcmp(m,b)==0)return p;//比较是否相等,返回
p++;
}
return -1;
}
这个程序我没有调试!
可以试试看看
zhyinty 2008-06-18
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>
int Search(char a[],int n,char m);
void main()
{
char *p=NULL,m;
int pos,n;
printf("Please enter array size:");
scanf("%d",&n);
p=(char *)calloc(n,sizeof(char));
if(p==NULL)
{
printf("No enough memory!\n");
exit(0);
}
printf("Please enter a string:");
scanf("%s",p);
printf("请输入要查找的字符:");
scanf("%c",&m);
scanf("%c",&m);

if( !(pos =Search(p,n,m)) )
{
printf("给定的字符在字符串中不存在!\n");
}
else
{
printf("pos=%d\n",pos);
}
}
int Search(char a[],int n,char m)
{
int i=0;
while (*(a+i) != m&&i<=n)
{
i++;
}
if (i==n)
{
return 0;
}
else return (i+1);
}
sukyin 2008-06-18
  • 打赏
  • 举报
回复
按照楼主的意思改了下:

#include <stdio.h>

int Search(char* src,char tar);
int main(){
char *p=NULL,m;
int pos,i=0,n;
printf("Please enter array size:");
scanf("%d",&n);
p=(char *)malloc(n+1);
p[n] = '\0';
printf("Please enter a string:");
scanf("%s",p);
fflush(stdin);
do{
printf("请输入要查找的字符:");
scanf("%c",&m);
fflush(stdin);
pos=Search(p,m);
if(pos==-1)
{
printf("给定的字符在字符串中不存在!\n");
}
else
{
printf("pos=%d\n",pos);
}
printf("继续么?\n");
scanf("%c",&m);
fflush(stdin);
}while(m =='y'||m=='Y');
system("pause");
}
int Search(char* src,char tar){
int len = strlen(src);
int i = 0;
for(;i<len;++i){
if(src[i]==tar) return i+1;
}
return -1;
}
ForestDB 2008-06-18
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <stdlib.h>

char Search(char a[], int n, char m); // 干嘛返回char
main()
{
char *p = NULL, m;
int pos,i = 0, n;

printf("Please enter array size: ");
scanf("%d", &n);
p = (char *)calloc(n, sizeof(char));
if(p == NULL)
{
printf("No enough memory!\n");
exit(0);
}

printf("Please enter a string: ");
scanf("%s", p);
printf("ipnut a char: ");
scanf("%c", &m);

pos = Search(p, n, m);
if(pos = -1) // =?应该是==
{
printf("not found");
}
else
{
printf("pos = %d\n", i);
}
}

char Search(char a[], int n, char m) // 可以返回int
{
int i = 0;
if(a[i] == m) // 只判断一次?用while吧,i也没有++
{
return 0;
}
else
{
return -1;
}
}

写了个例子:

#include <stdio.h>

int position(char *str, int c)
{
char *p = str;
while(*p && *p != c)
p++;
if(*p)
return p - str;
else
return -1;
}

int main(void)
{
char buffer[80] = { 0 }, c = 0;
int pos = 0;

printf("Please input a string: ");
scanf("%s", buffer);
scanf("%c", &c);
printf("Please input a char: ");
scanf("%c", &c);

pos = position(buffer, c);
if(pos == -1)
printf("Not found\n");
else
printf("pos = %d\n", pos);

return 0;
}
Ethan_yushui213 2008-06-18
  • 打赏
  • 举报
回复
scanf("%s",p); // 这个地方只会接收字符串,但是不会包括输入的回车
所以,在接下来的一句
scanf("%c",&m);就接收了前面的回车,然后就返回了
九十度黑 2008-06-18
  • 打赏
  • 举报
回复
用scanf("%s", str[])好像只能将没有空格的字符串存入数组,输入“thank you”,找不到o。
所以觉得还是用下面getline()好些。
#include <stdio.h>
#define MAXLINE 1000

int getline(char *line, int lim); //读取一行字符
int findAlpha(char source[], char alpha); //找到字符串中的字母,返回位置

int main()
{
char line[MAXLINE] = {0};
int index = -1;
char c;

printf("Enter a string:");
if (getline(line, MAXLINE) > 0)
{
printf("Enter a alpha:");
c = getchar();
if ((index = findAlpha(line, c)) != -1)
printf("first appear at position of %d.\n", index);
else
printf("No such alpha.\n");
}
system("PAUSE");
return 0;
}

int getline(char *line, int lim)
{
int c, i;

for (i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; i++)
line[i] = c;
if (c == '\n')
line[i++] = c;
line[i] = '\0';
return i;
}

int findAlpha(char source[], char alpha)
{
int i = 0;

while (source[i] != '\0' && source[i] != alpha)
i++;
if (source[i] == '\0')
return -1;
else
return i + 1;
}
  • 打赏
  • 举报
回复
这个是我之前给别人写的一个程序,给楼主改了改……运行一下……

/* checkstring.c
* 问题1、通过C程序,读电脑中写好的一个txt文件,查某一个单词在文中出现过多少次
* 问题2、查另一个单词,输出在文中首次出现的行、列数
*/

#include <stdio.h>
#include <string.h>

int judge_argc(int argc);
long matchstring(char *str,char *substr);
long get_interspace(char *argv1,long *iInterSpace);
long matchposition(char *argv1,char *argv2,long *iInterSpace,long *iMatchX,long *iMatchY);

/* 主函数:通过命令行输入参数,输入格式为:程序可执行文件名 文件名 字符串 */
int main(int argc,char *argv[])
{
long iInterSpace = 0; /* 文件大小(字节数) */
long iMatchX = 0; /* 行数 */
long iMatchY = 0; /* 列数 */

judge_argc(argc); /* 判断参数个数,如果个数不足,退出程序 */
get_interspace(argv[1],&iInterSpace); /* 获取文件大小 */
matchposition(argv[1],argv[2],&iInterSpace,&iMatchX,&iMatchY); /*获取字符串在文件中出现的次数和所在的行、列数 */

return 0;
}

/* 判断命令行参数个数,如果不足,退出程序 */
int judge_argc(int argc)
{
if(argc < 3)
{
printf("Input Error!\nUsage:programmename testfilename teststring\n");
printf("输入错误!\n使用方法:程序可执行文件名 文件名 字符串\n");
exit(2);
}

return 0;
}

/* 获取文件大小,以便之后程序中申请合适的空间 */
long get_interspace(char *argv1,long *iInterSpace)
{
FILE *fp;

if((fp = fopen(argv1,"r")) == NULL)
{
printf("Open the file named '%s' error!\n",argv1);
fclose(fp);
exit(2);
}

while(! feof(fp))
{
fgetc(fp);
*iInterSpace = *iInterSpace + 1;
}
fclose(fp);

return 0;
}

/* 判断匹配字符串的个数 */
long matchstring(char *str,char *substr)
{
char *p,*sp;
long iNum = 0;

p = str;
sp = substr;

while(*str != '\0')
{
str = p;
while(*substr != '\0')
{
if(*str == *substr)
{
substr++;
str++;
}
else
{
substr = sp;
str = p;
break;
}
}

if(*substr == '\0')
{
iNum = iNum + 1;
substr = sp;
p = str;
continue;
}
p++;
}

return iNum;
}

/* 判断输出具体的匹配行、列数,最后统计匹配总个数 */
long matchposition(char *argv1,char *argv2,long *iInterSpace,long *iMatchX,long *iMatchY)
{
FILE *fp;
char cString[*iInterSpace + 2]; /* 所有字符 */
char cPerLine[*iInterSpace + 2]; /* 单行字符 */
int ii,jj,kk; /* 临时变量,用来控制循环 */
long iReadNum = 0; /* 实际读取字符个数 */
long iLine = 0; /* 行数 */
long iMatchNum = 0;
long num = 0;

if((fp = fopen(argv1,"r")) == NULL)
{
printf("Open the file named '%s' error!\n",argv1);
fclose(fp);
exit(2);
}

/* 初始化缓冲空间,并一次性将数据都读出来 */
memset(cString,'\0',sizeof(cString));
memset(cPerLine,'\0',sizeof(cPerLine));

iReadNum = fread(cString,1,sizeof(cString),fp);
fclose(fp);

if((fp = fopen(argv1,"r")) == NULL)
{
printf("Open the file named '%s' error!\n",argv1);
fclose(fp);
exit(2);
}

/* unix、linux下不需要,所以注释掉了.*/
/* (经调试,发现windows下为了获得正确的行数,需要在最后多加一个\n,于是,定义空间的时候多加了2个字符) */
/*
cString[iReadNum] = '\n';
*/

iLine = matchstring(cString,"\n"); /* 获取正确的行数,以便控制之后的读取次数 */
num = matchstring(cString,argv2);

/* 重新打开文件,用fgets读取数据,通过行数控制读取次数 */
for(ii = 0;ii < iLine;ii++)
{
fgets(cPerLine,sizeof(cPerLine),fp);
*iMatchX = ii + 1; /* 获得正确的行数 */

/* 用strstr判断该行中是否有匹配的字符串,有的话,输出行、列数 */
if(strstr(cPerLine,argv2) != NULL)
{
for(jj = 0;jj < strlen(cPerLine);)
{
for(kk = 0;kk < strlen(argv2);kk++)
{
/* 有1个字符不匹配,退出本次循环 */
if(*(cPerLine + jj + kk) != *(argv2 + kk))
{
jj++;
break;
}
}

/* 都匹配时,输出行、列数 */
if(kk == strlen(argv2))
{
iMatchNum = iMatchNum + 1; /* 匹配个数 */
*iMatchY = jj + 1; /* 获得正确的列数 */
printf("%ld matched.\n",num); /* 2 */
printf("First matched position(Line:%ld,Row:%ld)\n",*iMatchX,*iMatchY);
exit(0); /* 1 */
jj++; /* 如果要输出所有的位置,则将1处语句改为break,将2处移到循环外,程序返回前 */
}
}
}
}
fclose(fp);

if(0 == iMatchNum)
{
printf("0 matched.\n");
exit(1);
}

return -1; /* 按照楼主要求改成了返回-1 */
}
  • 打赏
  • 举报
回复
这个是我之前给别人写的一个程序,给楼主改了改……运行一下……

/* checkstring.c
* 问题1、通过C程序,读电脑中写好的一个txt文件,查某一个单词在文中出现过多少次
* 问题2、查另一个单词,输出在文中首次出现的行、列数
*/

#include <stdio.h>
#include <string.h>

int judge_argc(int argc);
long matchstring(char *str,char *substr);
long get_interspace(char *argv1,long *iInterSpace);
long matchposition(char *argv1,char *argv2,long *iInterSpace,long *iMatchX,long *iMatchY);

/* 主函数:通过命令行输入参数,输入格式为:程序可执行文件名 文件名 字符串 */
int main(int argc,char *argv[])
{
long iInterSpace = 0; /* 文件大小(字节数) */
long iMatchX = 0; /* 行数 */
long iMatchY = 0; /* 列数 */

judge_argc(argc); /* 判断参数个数,如果个数不足,退出程序 */
get_interspace(argv[1],&iInterSpace); /* 获取文件大小 */
matchposition(argv[1],argv[2],&iInterSpace,&iMatchX,&iMatchY); /*获取字符串在文件中出现的次数和所在的行、列数 */

return 0;
}

/* 判断命令行参数个数,如果不足,退出程序 */
int judge_argc(int argc)
{
if(argc < 3)
{
printf("Input Error!\nUsage:programmename testfilename teststring\n");
printf("输入错误!\n使用方法:程序可执行文件名 文件名 字符串\n");
exit(2);
}

return 0;
}

/* 获取文件大小,以便之后程序中申请合适的空间 */
long get_interspace(char *argv1,long *iInterSpace)
{
FILE *fp;

if((fp = fopen(argv1,"r")) == NULL)
{
printf("Open the file named '%s' error!\n",argv1);
fclose(fp);
exit(2);
}

while(! feof(fp))
{
fgetc(fp);
*iInterSpace = *iInterSpace + 1;
}
fclose(fp);

return 0;
}

/* 判断匹配字符串的个数 */
long matchstring(char *str,char *substr)
{
char *p,*sp;
long iNum = 0;

p = str;
sp = substr;

while(*str != '\0')
{
str = p;
while(*substr != '\0')
{
if(*str == *substr)
{
substr++;
str++;
}
else
{
substr = sp;
str = p;
break;
}
}

if(*substr == '\0')
{
iNum = iNum + 1;
substr = sp;
p = str;
continue;
}
p++;
}

return iNum;
}

/* 判断输出具体的匹配行、列数,最后统计匹配总个数 */
long matchposition(char *argv1,char *argv2,long *iInterSpace,long *iMatchX,long *iMatchY)
{
FILE *fp;
char cString[*iInterSpace + 2]; /* 所有字符 */
char cPerLine[*iInterSpace + 2]; /* 单行字符 */
int ii,jj,kk; /* 临时变量,用来控制循环 */
long iReadNum = 0; /* 实际读取字符个数 */
long iLine = 0; /* 行数 */
long iMatchNum = 0;
long num = 0;

if((fp = fopen(argv1,"r")) == NULL)
{
printf("Open the file named '%s' error!\n",argv1);
fclose(fp);
exit(2);
}

/* 初始化缓冲空间,并一次性将数据都读出来 */
memset(cString,'\0',sizeof(cString));
memset(cPerLine,'\0',sizeof(cPerLine));

iReadNum = fread(cString,1,sizeof(cString),fp);
fclose(fp);

if((fp = fopen(argv1,"r")) == NULL)
{
printf("Open the file named '%s' error!\n",argv1);
fclose(fp);
exit(2);
}

/* unix、linux下不需要,所以注释掉了.*/
/* (经调试,发现windows下为了获得正确的行数,需要在最后多加一个\n,于是,定义空间的时候多加了2个字符) */
/*
cString[iReadNum] = '\n';
*/

iLine = matchstring(cString,"\n"); /* 获取正确的行数,以便控制之后的读取次数 */
num = matchstring(cString,argv2);

/* 重新打开文件,用fgets读取数据,通过行数控制读取次数 */
for(ii = 0;ii < iLine;ii++)
{
fgets(cPerLine,sizeof(cPerLine),fp);
*iMatchX = ii + 1; /* 获得正确的行数 */

/* 用strstr判断该行中是否有匹配的字符串,有的话,输出行、列数 */
if(strstr(cPerLine,argv2) != NULL)
{
for(jj = 0;jj < strlen(cPerLine);)
{
for(kk = 0;kk < strlen(argv2);kk++)
{
/* 有1个字符不匹配,退出本次循环 */
if(*(cPerLine + jj + kk) != *(argv2 + kk))
{
jj++;
break;
}
}

/* 都匹配时,输出行、列数 */
if(kk == strlen(argv2))
{
iMatchNum = iMatchNum + 1; /* 匹配个数 */
*iMatchY = jj + 1; /* 获得正确的列数 */
printf("%ld matched.\n",num); /* 2 */
printf("First matched position(Line:%ld,Row:%ld)\n",*iMatchX,*iMatchY);
exit(0); /* 1 */
jj++; /* 如果要输出所有的位置,则将1处语句改为break,将2处移到循环外,程序返回前 */
}
}
}
}
fclose(fp);

if(0 == iMatchNum)
{
printf("0 matched.\n");
exit(1);
}

return 0;
}

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧