【问题标题】:How to Trim of the spaces(right side) in this Array?如何修剪此数组中的空格(右侧)?
【发布时间】:2019-01-24 11:27:07
【问题描述】:

您好,我在用 C 语言解决编程任务时遇到问题。

函数“Trim”应该替换字符串末尾的所有空格 与空。作为参数,它得到一个字符串,但它不需要返回 任何东西。

第二个函数“countSpaces”应该计算数组中的所有空格。 作为参数,它得到一个 2 dementional Array,它应该返回 数组中的空格数。

不允许使用其他标头。

德语原文:

Die erste Funktion Trim soll alle Leerzeichen am Ende einer Zeichen- kette löschen (d.h. mit dem ASCII-Wert 0 überschreiben)。参数 wird die Zeichenkette übergeben。 Die Funktion gibt nichts zurück。

死 zweite Funktion countSpaces soll alle Leerzeichen in einem Array von 10 Zeichenketten mit je maxal 50 Zeichen zählen。参数 erhält es ein zweidimensionales Array von Zeichen。 Das Funktions-ergebnis ist die Anzahl der Leerzeichen in allen Zeichenkette des Arrays von Zeichenketten。

Weitere Headerdateien sind nicht erlaubt

#include <stdio.h>

int main()
{
   char Text[10][50] = {"Dies ist ein langer      ",
                        "Text, der in mehreren    ",
                        "Zeilen untergebracht     ",
                        "ist und der auch noch    ",
                        "in manchen Zeilen mehrere",
                        "Leerzeichen am Ende      ",
                        "beinhaltet! Die Leer-    ",
                        "zeichen dieses Textes    ",
                        "sollen gezählt werden!   ",
                        "                         "};
   int i = 0;
   for (i = 0; i < 10; i++)
      Trim(Text[i]);
   printf("\nIn dem Text sind %i Leerzeichen enthalten!\n",
           countSpaces(Text));
}

更新: 这就是我现在的立场,感谢你们的遮阳篷,我现在在这里:

#include <stdio.h>

int  mystrlen(const char *str);
void *Trim(char *str, int ch);
int countspaces(const char *str);


int main()
{

   char Text[10][50] = {"Dies ist ein langer      ",
                        "Text, der in mehreren    ",
                        "Zeilen untergebracht     ",
                        "ist und der auch noch    ",
                        "in manchen Zeilen mehrere",
                        "Leerzeichen am Ende      ",
                        "beinhaltet! Die Leer-    ",
                        "zeichen dieses Textes    ",
                        "sollen gezählt werden!   ",
                        "                         "};
   int i = 0;
   for (i = 0; i < 10; i++)
   {

       Trim(Text[i], ' ');
       printf("Number of spaces after trim: %d\n", countspaces(Text[i]));
   }
}


int mystrlen(const char *str)
{
    const char *end = str;

    while(*end++);

    return end - str - 1;
}


void *Trim(char *str, int ch)
{
    char *end = str + mystrlen(str) - 1;

    do
    {
        if(*end == ch) 
        {
            *end = 0;
        }
        else
        {
            break;
        }
    }while(str != end--);
    return str;
}

int  countspaces(const char *str)
{
    int  count = 0;

    while(*str)
    {
        count += *str++ == ' ' ? 1 : 0;
    }
    return count;
}

到目前为止它有效。

是否也可以计算整个数组的空间?

【问题讨论】:

  • 家庭作业?到目前为止你尝试过什么?
  • 别忘了 C 中的 char 字符串实际上称为 null-terminated 字节字符串。将一个字符更改为空终止符'\0' 会有效地终止(并截断)该位置的字符串。
  • 请阅读the help pages,阅读the SO tour,阅读how to ask good questions,以及this question checklist。最后学习如何创建minimal reproducible example
  • OT - 家庭作业。纯粹的代码编写请求在 Stack Overflow 上是题外话——我们希望这里的问题与特定编程问题相关——但我们很乐意帮助您自己编写!告诉我们what you've tried,以及您遇到的问题。这也将有助于我们更好地回答您的问题。

标签: c arrays trim


【解决方案1】:
char *remove_trailing_char(char *str, int ch)
{
    char *end = str + strlen(str) - 1;

    do
    {
        if(*end == ch) 
        {
            *end = 0;
        }
        else
        {
            break;
        }
    }while(str != end--);
    return str;
}

完整的解决方案

size_t mystrlen(const char *str)
{
    const char *end = str;

    while(*end++);

    return end - str - 1;
}


char *remove_trailing_char(char *str, int ch)
{
    char *end = str + mystrlen(str) - 1;

    do
    {
        if(*end == ch) 
        {
            *end = 0;
        }
        else
        {
            break;
        }
    }while(str != end--);
    return str;
}

size_t countspaces(const char *str)
{
    size_t count = 0;

    while(*str)
    {
        count += *str++ == ' ' ? 1 : 0;
    }
    return count;
}

int main()
{
    size_t nspaces;
   char Text[10][50] = {"Dies ist ein langer      ",
                        "Text, der in mehreren    ",
                        "Zeilen untergebracht     ",
                        "ist und der auch noch    ",
                        "in manchen Zeilen mehrere",
                        "Leerzeichen am Ende      ",
                        "beinhaltet! Die Leer-    ",
                        "zeichen dieses Textes    ",
                        "sollen gezählt werden!   ",
                        "                         "};
   int i = 0;
   for (i = 0; i < 10; i++)
   {
       printf("Number of spaces before trim: %zu\n", countspaces(Text[i]));
       remove_trailing_char(Text[i], ' ');
       printf("Number of spaces after trim: %zu\n", countspaces(Text[i]));
   }
}

然后自己玩https://onlinegdb.com/H1p13QDXE

【讨论】:

  • hmmm 遗憾的是,这对我没有帮助,我试图从中做出“空白修剪”功能但失败了:/
  • @ArchDoge 更改返回类型应该无关紧要。该函数只返回一个指向作为参数传递的字符串的指针。你怎么称呼它,它是如何失败的?由于不允许使用其他头文件,我猜你不应该使用strlen,而是自己实现替换。
  • 如果现成的功能没有帮助 - 你需要从 C 书开始。
  • 我实际上坐在这里,手里拿着一本密码本,喜欢 200 万个打开的标签页,但仍然不明白......对不起,我是 C 新手
  • 感谢完整的解决方案,我仍在尝试理解它,但这可能需要一些时间,我稍微玩弄一下代码。
猜你喜欢
  • 2020-01-21
  • 2013-07-11
  • 2011-08-11
  • 1970-01-01
  • 1970-01-01
  • 2015-07-01
  • 2020-07-31
  • 1970-01-01
  • 2023-02-05
相关资源
最近更新 更多