当前位置: 首页 > 知识库问答 >
问题:

C语言:给定一个字符串,删除/删除包含n个元音的单词

盖向荣
2023-03-14

给定一个整数< code>n,程序必须删除包含< code>n个元音的每个单词。该字符串是从test.txt文件中读取的,该文件包含以下内容:< code>Astazi nu este maine。目前我的程序包含一个< code>count1函数,它计算字符串中每个单词的字符数和元音数。当输入< code>n元音字母以删除所需单词并打印更新后的字符串时,如何使用< code>count1函数中的数据作为引用?

我有一个想法,我不确定如何实现。在 count1 中,我们已经计算了每个单词的元音数,因此,用户给定 n,我们检查这个数字是否等于 count1 函数中的 v,所以我们做 int num_of_words ,然后我们做一个循环,打印出所需的单词,直到 num_of_words=0

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


void count1 (char* str)
{
    for (int i = 0;;)
        for (int v = 0, w = i;;)
        {
            int len;
            char c = str[i++];
            switch (c)
            {
            case 'A':
            case 'E':
            case 'I':
            case 'O':
            case 'U':
            case 'a':
            case 'e':
            case 'i':
            case 'o':
            case 'u':
                v++;
            default:
                continue;
            case ' ':
            case '\t':
            case '\n':
            case '\0':
                len = i - 1 - w;
                printf("'%.*s': %d characters, %d vowels\n", len, str+w, len, v );
                if (c)
                    break;
                else
                    return;
            }
            break;
        }
}

void count2 (char* str, int n)
{
    char line2[128];
    int ls=strlen(str);
    for (int i = 0;;)
        for (int v = 0, w = i;;)
        {
            int len;
            char c = str[i++];
            switch (c)
            {
            case 'A':
            case 'E':
            case 'I':
            case 'O':
            case 'U':
            case 'a':
            case 'e':
            case 'i':
            case 'o':
            case 'u':
                v++;
            default:
                continue;
            case ' ':
            case '\t':
            case '\n':
            case '\0':
                for(int k = 0; str[k] != '\0'; k++)
                {
                    if (k == 0 || isspace(str[k]))
                    {
                        if(v==n)
                        {
                            strcat(line2, str+1);
                        }
                    }
                }
                printf("%s ", line2);
                if (c)
                    break;
                else
                    return;
            }
            break;
        }
}

int main()
{
    FILE *fp;
    char line[128];
    int c=0, count[26]= {0}, x;
    int n;

    fp = fopen("test.txt", "r");

    fscanf(fp, "%[^\n]", line);
    fclose(fp);
    printf("%s\n\n", line);

    while (line[c] != '\0')
    {
        if (line[c] >= 'a' && line[c] <= 'z')
        {
            x = line[c] - 'a';
            count[x]++;
        }
        c++++;
    }

    for (c = 0; c < 26; c++)
    {
        printf("%c occurs %d times.\n", c + 'a', count[c]);
    }
    printf("\n");
    count1(line);
    printf("\nInsert n: ");
    scanf("%d", &n);
    count2(line, n);



    return 0;
}

共有2个答案

戚俊健
2023-03-14

这是我的最终解决方案

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


void count1 (char* str)// count numbers of vowels for each word
{
    for (int i = 0;;)
        for (int v = 0, w = i;;)
        {
            int len;
            char c = str[i++];
            switch (c)
            {
            case 'A':
            case 'E':
            case 'I':
            case 'O':
            case 'U':
            case 'a':
            case 'e':
            case 'i':
            case 'o':
            case 'u':
                v++;
            default:
                continue;
            case ' ':
            case '\t':
            case '\n':
            case '\0':
                len = i - 1 - w;
                printf("'%.*s': %d characters, %d vowels\n", len, str+w, len, v );
                if (c)
                    break;
                else
                    return;
            }
            break;
        }
}

void print_x(char* str, int n)
{
    char* tmp;
    unsigned int cnt = 0, stat = 0;
    const char aeiou[] = "AEIOUaeiou";
    while(*str)
    {
        switch(stat)
        {
        case 0://the word did not start
            if (!isalpha(*str))
            {
                putchar(*str);
                break;
            }
            stat = 1;
            tmp = str;
            cnt = 0;
        case 1://the word started
            if (strchr(aeiou, *str))
            {
                cnt++;
                break;
            }
            if (! isalpha(*str))
            {
                if (cnt != n)
                while(tmp <= str) putchar(*(tmp++));
                else putchar(*str);
                stat = 0;
            }
        } // end switch
        ++str;
    }
    if (stat)
    {
        --str;
        if (cnt != n) while(tmp <= str) putchar(*(tmp++));
    }
}


int main()
{
    FILE *fp;
    char line[128], line2[128];
    int c=0, count[26]= {0}, x;
    int n,a;
    int i,j;

    fp = fopen("test.txt", "r");

    fscanf(fp, "%[^\n]", line);
    fclose(fp);
    printf("%s\n\n", line);

    while (line[c] != '\0')
    {
        if (line[c] >= 'a' && line[c] <= 'z')
        {
            x = line[c] - 'a';
            count[x]++;
        }
        c++;
    }

    for (c = 0; c < 26; c++)
    {
        printf("%c occurs %d times.\n", c + 'a', count[c]);
    }

    for (i = 0; i < 26; ++i)
    {
        for (j = i + 1; j < 26; ++j)
        {
            if (count[i] < count[j])
            {
                a = count[i];
                count[i] = count[j];
                count[j] = a;
            }
        }
    }
    printf("\n\n");

    for (c = 0; c < 26; c++)
    {
        printf("%c occurs %d times.\n", c + 'a', count[c]);
    }

    printf("\n");
    count1(line);
    printf("\nInsert n: ");
    scanf("%d", &n);

    if (!(fp = fopen("./test.txt", "r")))
    {
        printf("unable open file\n");
        return 1;
    }
    while (fgets(line, 128, fp))
        print_x(line, n);
    fclose(fp);

    return 0;
}
百里秋月
2023-03-14

如果您有一个字符串str,它由单独的单词组成,通过'''\n''或'\t'将它们彼此隔开,并且您希望有一个包含str中满足某些条件的所有单词的字符串,那么对其进行编程将有点困难,即将str更改为所需的字符串,而不使用某种类型的“助手数组”。

相反,我建议创建一个大小相同的新 char 数组(比如 str2),每次你找到一个满足条件的单词(条件可以是例如:没有 1 个元音),你把你找到的单词从 str 复制到 str2

像这样:

char str[128];
// read from file to str using fscanf
char str2[128];
for (int c = 0; str[c] != '\0'; ++c)
{
   if (c == 0 || isspace(str[c]))
   {
      if (! is_1_vowel[str+1]) // if it doesn't have exacly one vowel
      {
          // copy the word from str to str2
          strcat_word(str2, str+1); // a user-defined adapted version of strcat that will copy from src to dest only till src reaches a space character or '\0'
      }
   }
}

我在这里假设< code > is _ 1 _元音将是一个遍历单个单词(而不是整个行或文件)的函数,如果它满足条件(有1个元音),则返回1,否则返回0。

 类似资料:
  • 如何使用Swift从String变量中删除最后一个字符?在文档中找不到它。 以下是完整的示例:

  • 问题内容: 我想删除字符串的第一个字符。 例如,我的字符串以a开头,而我只想删除它。字符串中有几次不应删除。 我正在用Python编写代码。 问题答案: python 2.x python 3.x 两张画

  • 本文向大家介绍Objective-C语言删除元素,包括了Objective-C语言删除元素的使用技巧和注意事项,需要的朋友参考一下 示例 从特定索引处删除: 删除特定对象的第一个实例: 删除特定对象的所有实例: 删除所有对象: 删除最后一个对象:            

  • 问题内容: 我正在尝试从文本文件中读取文本,读取行,删除包含特定字符串的行(在这种情况下为“坏”和“顽皮”)。我写的代码是这样的: 我这样写,但没有成功。 重要的一件事是,如果文本的内容是这样的: 我不希望输出有空行。所以不喜欢: 但是像这样: 我应该从上面的代码中编辑什么? 问题答案: 您可以像这样使代码更简单,更易读 使用上下文管理器和任何。

  • 问题内容: 如何在C#中使用正则表达式删除所有HTML标记,包括&nbsp。我的弦看起来像 问题答案: 如果您不能使用面向HTML解析器的解决方案来过滤标签,则这里有一个简单的正则表达式。 理想情况下,您应该再次通过正则表达式过滤器,该过滤器将多个空格

  • 问题内容: 所以我有以下格式的日志消息: 现在,我想删除所有不包含特定字符串“ xyz”的日志,并保留其余所有日志。我也想索引时间戳。 grokdebug没有太大帮助。 这是我的尝试: 我是新手,所以上面的模式可能没有意义。请帮忙。 问题答案: 要删除不包含字符串的消息: 您的骗子模式没有抓住日志的日期部分。 一旦在grok模式中有一个包含日期的字段,就可以在该字段上调用日期过滤器。 因此,您的g