我试图这样做,一个打印像这样的字符串的程序
char str[] = "This is a test string";
然后获得此输出
This
is
a
test
string
所有这些都没有使用循环和递归。有可能这样做吗?
答案 0 :(得分:1)
正如对此答案的评论中所述,goto
只是for
,while
等的不良替代品。从技术上讲,它是一个循环,因此编写程序没有循环几乎是不可能的。
此外,正如其他人所提到的,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;
}
此功能将返回文本,每个单词都在另一个下面。
编辑: 请注意,这将始终与循环一起使用。即使没有直接调用,你的应用程序也必须遍历范围内的所有字符。