【问题标题】:Printing paragraphs with newline characters打印带有换行符的段落
【发布时间】:2021-11-09 11:35:14
【问题描述】:

我必须编写一个 C 程序,其中输出应该与输入相同,但删除了所有元音。除了我的程序没有打印出句子之间的换行符之外,一切正常。我必须使用 printf 和 scanf。

输入:

Peter Piper picked a peck of pickled peppers.
A peck of pickled peppers Peter Piper picked.
If Peter Piper picked a peck of pickled peppers,
Where's the peck of pickled peppers Peter Piper picked?

Peter Piper picked a peck of pickled peppers.
If Peter Piper picked a peck of pickled peppers,
How many pickled peppers that Peter Piper picked?

我的程序的输出:

Ptr Ppr pckd  pck f pckld ppprs. pck f pckld ppprs Ptr Ppr pckd.f Ptr Ppr pckd  pck f pckld ppprs,Whr's th pck f pckld ppprs Ptr Ppr pckd?Whr's th pck f pckld ppprs Ptr Ppr pckd?Whr's th pck f pckld ppprs Ptr Ppr pckd?Whr's th pck f pckld ppprs Ptr Ppr pck ...

句子后面好像没有打印出\n

这是我的代码:

void check_and_print_consonants(char string1[], char string2[]) {
     int vowel = 0;
     int str1_len = strlen(string1);
     int str2_len = 10;
     for (int i = 0; i < str1_len; i++) {
         for (int j = 0; j < str2_len; j++) {    
             if (string1[i] == string2[j]) {
                  vowel = 1;
             }
         }
         if(vowel == 0){
            printf( "%c", string1[i]);
         }
         else{
            vowel = 0;
         }
     }
}

int main(void) {
    //collect input in an array
   
    char input[128];
    char vowels[] = {'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'};
    
    while (scanf("%99[^\n]%*c", input) != EOF){
        check_and_print_consonants(input, vowels);
    }
    
    printf("\n");
    return 0;   
}

我不知道我哪里错了。

【问题讨论】:

  • 您不打印\n,因此输出中没有行尾是正常的。你试过调试这个吗?
  • 是否允许使用memchrstrchrstrspnstrcspn等库函数?
  • 好吧,如果可以解决问题,也许只是在.,? 之后打印\n? :)
  • 使用fgets(),而不是scanf()

标签: arrays c char printf scanf


【解决方案1】:

为什么要逐行读取输入?你冒着换行符出错的风险!!!

#include <stdio.h>
int main()
{
    int c;
    while ((c = getchar()) != EOF) {
        switch(c) {
        case 'a': case 'e': case 'i': case 'o': case 'u':
        case 'A': case 'E': case 'I': case 'O': case 'U':
            continue; /* ignore */
        }
        putchar(c); /* output */
    }
}

【讨论】:

    【解决方案2】:

    scanf("%99[^\n]%*c", input) 专门忽略换行符

    scanf("%99[^\n]%*c", input)
           ^^^^^^^^   . . . . . .  read everything but a newline character
                   ^^^  . . . . .  ignore one character (the newline)
    

    所以您需要自己在某些地方添加换行符。

    正如建议的那样,我会逐个字符地读取输入,然后在出现元音的情况下立即打印。

    // loop {
    //    get a char
    //    if it is not a vowel print it (includes printing newlines)
    // }
    

    【讨论】:

    • 详细信息:如果行是 "\n"scanf("%99[^\n]%*c", input) 什么也不读。它也无法读取 除了换行符之外的所有内容 带有长行。
    【解决方案3】:

    你可以这样做:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main(void)
    {
        char *input = "peter parker\npiper parker\neminem's rapper\n";
        char vowels[] = {'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'};
        
        for (int i = 0; input[i] != '\0'; i += 1) {
            for (int j = 0; vowels[j] != '\0'; j += 1) {
                if (input[i] == vowels[j]) {
                    i += 1;
                    break;
                }
            }
            printf("%c", input[i]);
        }
        return 0;   
    }
    • 第一个 for 循环用于浏览您的输入(第 10 行)
    • 第二个 for 循环在这里将每个元音与输入数组中的每个字符进行比较(第 11 行)
    • if 语句是为了避免打印元音,它只绕过元音而不是\n(第 12 行)
    • break 关键字是在找到元音 (Line (Line 14)) 时停止第二个 for 循环

    您可以轻松添加 scanf。

    如果您需要帮助,请随时问我 :)

    【讨论】:

      猜你喜欢
      • 2017-09-09
      • 2019-08-01
      • 2013-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-30
      • 2019-08-27
      • 1970-01-01
      相关资源
      最近更新 更多