分析出一个字符串中的单词

发布于 2021-11-10 18:19:00 字数 511 浏览 1009 评论 20

本意是想分析出一个字符串中的单词,每个单词一行,如果字符串里有很多不属于单词的,总是有太多的换行。希望指正!!!!!!

#include char str[1024]; void strtoken (char *str) { int i; for (i=0;str[i];i++) { if(((str[i]<='z'&&str[i]>='a')||(str[i]<='Z'&&str[i]<='A')) &&(str[i]!=' ')&&(str[i]!='*') ) { printf("%c",str[i]); } /* if(str[i++]==' ') { continue; // else printf("n"); } */ else printf("n"); } return; } int main(void) { printf("please input a string :n"); fgets(str,1024,stdin); strtoken(str); return 0; }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(20

三月梨花 2021-11-12 07:34:08

请高手优化此程序,要求单词换行输出,但不空行。

 

#include<stdio.h>

char str[1024],delim[1024];

void strtoken (char *str, char *delim) 
{ 
    int i,j,flag=0; 
	
    for(j=0; delim[j]; j++) 
    { 
        for(i=0;str[i];i++) 
            if(str[i] != delim[j])
                ;

            else if (str[i]) 
            {
                str[i] = 'n';
			
                continue;
            }
            else
                printf("n");
    }

    for ( i = 0; str[i]; i++)
    {
		while(str[i]=='n'&&str[i+1]=='n')
		{
			flag=1;
			i++;
		}
		if(flag)
		{
			printf("n");
			flag=0;
		}
        printf("%c", str[i]);
    }

    return;
} 

int main()
{
	printf("please input a string:n");
	fgets(str,1024,stdin);
	printf("please input a string:n");
	fgets(delim,1024,stdin);
    strtoken(str,delim);
	return 0;
}
臻嫒无言 2021-11-12 07:34:08

继续关注

爱你是孤单的心事 2021-11-12 07:34:07

引用来自“罗光盛”的答案

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

char str[1024],delim[100]; 
void strtoken (const char *str,const char *delim) 
{ 
    int i,j; 
    for(j=0; delim[j]; j++) 
    { 
        for(i=0;str[i];i++) 
            if(str[i] != delim[j])
                printf("%c",str[i]);
//          else if(str[i++]==delim[j]) 
            else if (str[i])
                // printf("%c",str[i]); 
                continue; 
            else printf("n");
    }
    printf("n%d %d", j, i);
    return;
} 
int main(int argc ,char *argv[]) 
{ 
    printf("please input a string :n"); 
    fgets(str,1024,stdin);
    printf("please input a string :n"); 
    fgets(delim,100,stdin); 
    strtoken(str,delim); 
    return 0; 
}
裸钻 2021-11-12 07:34:07

如你所说,用你的程序你话也可以这样改,将所有你要替换的字符换成'n'

void strtoken (char *str, char *delim) 
{ 
    int i,j; 
    for(j=0; delim[j]; j++) 
    { 
        for(i=0;str[i];i++) 
            if(str[i] != delim[j])
                ;
//                printf("%c",tmp_str[i]);
            else if (str[i]) 
            {
                str[i] = 'n';
                continue;
            }
            else
                printf("n");
    }
    for (int i = 0; str[i]; i++)
    {
        printf("%c", str[i]);
    }
    return;
} 
回忆凄美了谁 2021-11-12 07:34:07

@梦飞翔宇内: 你再定义个中间数组,再将原数组变换后的值赋值给中间数组,在赋值时比较看看有没有重复的'n',把它不赋值就行了嘛。

平生欢 2021-11-12 07:34:07

罗大哥,您好,我想请教一下,在您修改的这个程序中,如何剔除for循环中的过多的换行呢?

永不分离 2021-11-12 07:34:07

谢谢您了,不过还有一点不足,就是如果多个不匹配的字符在一起,那么输出的换行就太多了,

猫九 2021-11-12 07:34:07
#include<stdio.h>

char str[1024],delim[1024];

void strtoken (char *str, char *delim) 
{ 
    int i,j; 
	
    for(j=0; delim[j]; j++) 
    { 
        for(i=0;str[i];i++) 
            if(str[i] != delim[j])
                ;

            else if (str[i]) 
            {
                str[i] = 'n';
			
                continue;
            }
            else
                printf("n");
    }

    for ( i = 0; str[i]; i++)
    {
        printf("%c", str[i]);
    }

    return;
} 

int main()
{
	printf("please input a string:n");
	fgets(str,1024,stdin);
	printf("please input a string:n");
	fgets(delim,1024,stdin);
    strtoken(str,delim);
	return 0;
}
甜柠檬 2021-11-12 07:34:06

在您的帮助下,我有了进一步的了解啦!感谢您的指点!

凯凯我们等你回来 2021-11-12 07:34:00

插入代码时不要直接把代码粘贴到编辑器里,而是点击编辑器右上的“编辑上插入程序代码或脚本”。(在插入表情符号的右边 ),在弹出的对话框里选择你要插入的语言类型,粘贴代码就好了。

乞讨 2021-11-12 07:33:40

我也发现了提交的程序没有排版,但是,我不知道该怎么操作的,求教高手,程序在评论和发布是如何进行排版?

残花月 2021-11-12 07:33:32

这个程序不能达到分析出单词的效果,输出的j是统计除了单词以外的字符的个数吧?

陌上芳菲 2021-11-12 07:29:40

@梦飞翔宇内: 你是想怎样分析出单词呢?我以为你是想逐个的输出在第一次输入的字符串中剔除第二次输入的字母呢?

终陌 2021-11-12 07:26:46

@罗光盛: 单词是由字母组成的,除字母以外的字符都要剔除的,您改的是实现了剔除了空格,但是其中的!不是单词,却依然被输出了。还有一点是,您在控制输出时单词全部在一起,组成了一个长串了。

筱武穆 2021-11-12 07:12:46

不解释

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

char str[1024],delim[100]; 
void strtoken (const char *str,const char *delim) 
{ 
    int i,j; 
    for(j=0; delim[j]; j++) 
    { 
        for(i=0;str[i];i++) 
            if(str[i] != delim[j])
                printf("%c",str[i]);
//          else if(str[i++]==delim[j]) 
            else if (str[i])
                // printf("%c",str[i]); 
                continue; 
            else printf("n");
    }
    printf("n%d %d", j, i);
    return;
} 
int main(int argc ,char *argv[]) 
{ 
    printf("please input a string :n"); 
    fgets(str,1024,stdin);
    printf("please input a string :n"); 
    fgets(delim,100,stdin); 
    strtoken(str,delim); 
    return 0; 
}
緦唸λ蓇 2021-11-12 04:55:21

我用gcc编译一下,出现了bool庅没有声明 anaylze.c: In function ‘strtoken’: anaylze.c:8:6: error: ‘bool’ undeclared (first use in this function) anaylze.c:8:6: note: each undeclared identifier is reported only once for each function it appears in anaylze.c:8:11: error: expected ‘;’ before ‘bIsReturn’ anaylze.c:22:14: error: ‘bIsReturn’ undeclared (first use in this function) anaylze.c:22:26: error: ‘false’ undeclared (first use in this function) anaylze.c:37:26: error: ‘true’ undeclared (first use in this function) 但是我使用int 类型就可以消除这些提示,请问这是什么原因呢?

执手闯天涯 2021-11-12 03:26:55

如果 if(!bIsReturn)也不行的话,就改为 if (iReturn == 0)

夜无邪 2021-11-12 02:26:22

@梦飞翔宇内: bool类型是c++里面定义的,c是不支持bool类型的,如过想使用bool类型用g++编译源文件。

反目相谮 2021-11-12 01:51:34

没有经过严格测试,这样是不是你想要的结果:

void strtoken (char *str)
{
	int i;
	bool bIsReturn = true;
	for (i=0;str[i];i++)
	{
		if( ((str[i] <= 'z' && str[i]>='a') || (str[i] <= 'Z' && str[i] >= 'A'))
			&& (str[i]!=' ') && (str[i]!='*') )
		{
			printf("%c",str[i]);
			bIsReturn = false;
		}
		else
		{
			if (!bIsReturn)
			{
				printf("n");
			}
			bIsReturn = true;
		}

	}
	return;
}
清欢 2021-11-11 16:22:01

不是很明白lz的意义是什么。不过,我觉得这句有问题:

((str[i]<='z'&&str[i]>='a')||(str[i]<='Z'&&str[i]<='A'))

或号后面应该是 小于等于Z,大于等于A吧。

看程序意义应该是解析输入字符串中的字母,如果是连续英文字符,输出。

如果是空格或“*”,输出换行吧。

如果是为了解决换行太多的问题,你可以进行判断,如果当前需要输出换行,则检测它前面是否已经有换行。如果有,则不输出即可。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文