将字符串打印在彼此下方

时间:2015-10-17 13:06:06

标签: c

我试图这样做,一个打印像这样的字符串的程序

char str[] = "This is a test string";

然后获得此输出

This
is
a
test
string

所有这些都没有使用循环和递归。有可能这样做吗?

4 个答案:

答案 0 :(得分:1)

正如对此答案的评论中所述,goto只是forwhile等的不良替代品。从技术上讲,它是一个循环,因此编写程序没有循环几乎是不可能的

此外,正如其他人所提到的,printf和类似的屏幕I / O函数最有可能也使用循环,所以"所有这些都不使用循环或递归[...]"应该很难。

编写"在单独的行上打印每个单词"但是,部分作为一般解决方案 1 可以使用goto关键字完成。以下程序用' '替换\n的每个出现,然后打印字符串:

size_t i = 0;
loop_beg:
    if (!str[i])
        goto loop_end;
    if (str[i] == ' ')
        str[i] = '\n';
    ++i;
    goto loop_beg;
loop_end:

printf("%s\n", str);

注意:这可能会在汇编级别编译成循环,然后大致相当于C中的for - 循环结构,但我会忽略它。 < / p>

与此相关,你应该阅读(或至少略读)Edsger Dijsktra(荷兰人,发明的信号量,共同编写OS&#34; THE&#34;)"Go To Statement Considered Harmful"。< / p>

1 只需在一行上打印此特定字符串的每个单词,显然都不需要。

答案 1 :(得分:0)

你可以使用strtok来获取,但它是在循环的帮助下实现的,并且非常整洁

char str[] ="This is a test string";
  char * pch;
  pch = strtok (str," ");
  while (pch != NULL)
  {
    printf ("%s\n",pch);
    pch = strtok (NULL, " ");  <-- delimiter to seperate the string
  }

答案 2 :(得分:0)

#include <stdio.h>

int main(void)
{
    char str[] = "         this     is a string";

    char *ptr = str;

    bool init = 0;

    int n = 0;

BlackLabel:
    if( *ptr == '\0' )
         goto exit;

    n++;

    if( *ptr == ' ' )
        n = 0;

    if( n == 1 )
    {
        if( init )
        {
            putc('\n',stdout);
        }
    }

    if( n > 0 )
    {
        init = 1;
        printf("%c",*ptr);
    }

    *ptr++;

    goto BlackLabel;

exit:
    putc('\n',stdout);

    return 0;
}

答案 3 :(得分:-1)

我建议用新的线路指示器替换空间。

public string f(string input)
{
 str = str.Replace(" ", "\n");
 return str;
}

此功能将返回文本,每个单词都在另一个下面。

编辑: 请注意,这将始终与循环一起使用。即使没有直接调用,你的应用程序也必须遍历范围内的所有字符。