输出字符串的所有子字符串

霸气傲中原 2011-10-31 02:15:39
好吧,我承认我是菜鸟!
假设有一字符串"abcdefgh",输出它的所有子字符串。
a
ab
abc
.
.
.
abcdefgh
b
bc
.
.
.
bcdefgh
c
cd
.
.
.
h

我是这样写的:
#include<iostream>
using namespace std;
int main()
{
char ch[]={'a','b','c','d','e','f','g','h','\0'};
int num=sizeof(ch)/sizeof(char);
int i,j,k;
for(i=0;i<num;i++)
{
for(j=i;j<num;j++)
{
for(k=0;k<=j&&i+k<num;k++)
cout<<ch[i+k];
cout<<endl;
}
}
return 0;
}


为什么会重复输出呢?求高手不吝赐教!谢谢!
...全文
207 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
霸气傲中原 2011-11-01
  • 打赏
  • 举报
回复
首先谢谢你

这句是我的代码int num=strlen(ch); //这句是你的int num=sizeof(ch)/sizeof(char);
这边我的会比你少1。 //我的值为8,你的值为9
所以我这句for(j=0;j<num-i;j++)跟你这句for(j=0;j<num-i-1;j++)也会差个1。

夏夏夏奇 2011-10-31
  • 打赏
  • 举报
回复
你的第一个代码还是会有重复输出的,具体的请看我的代码。
霸气傲中原 2011-10-31
  • 打赏
  • 举报
回复
感谢各位的帮助,小弟不胜感激。虽然各位给的都不错,但我还是觉得这两个比较好理解。
#include<iostream>
using namespace std;
int main()
{
char ch[]={'a','b','c','d','e','f','g','h','\0'};
int num=strlen(ch);
int i,j,k;
for(i=0;i<num;i++)
{
for(j=0;j<num-i;j++)
{
for(k=0;k<=j;k++)
cout<<ch[i+k];
cout<<endl;
}
cout<<endl;
}
}


#include<iostream>
using namespace std;
int main()
{
char ch[]={'a','b','c','d','e','f','g','h','\0'};
int num=strlen(ch);
int i,j,k;
for(i=0;i<num;i++)
{
for(j=i;j<num+1;j++)
{
for(k=i;k<j;k++)
cout<<ch[k];
cout<<endl;
}
cout<<endl;
}
}

GoonYangXiaofang 2011-10-31
  • 打赏
  • 举报
回复

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

int main()
{
char ch[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', '\0'};
int i = 0, j = 0, k = 0;
int len = strlen(ch);
for (i = 0; i != len; ++i)
{
for (j = i; j != len; ++j)
{
for (k = i; k != j + 1; ++k)
{
printf("%c", ch[k]);
}
printf("\n");
}
}

return 0;
}
测试NULL 2011-10-31
  • 打赏
  • 举报
回复
方法有很多,给你一种比较容易理解的方法:

#include<iostream>
#include<string>
using namespace std;
int main()
{
int i, j;
string s = "abcdefgh";

for(i=0; i< s.length(); i++)
{
for(j = 0; j <= s.length()-i; j++)
{
cout << s.substr(i, j) << "\n";
}
}

return 0;
}
赵4老师 2011-10-31
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <string.h>
char *a="abcde";
int L,i,j,k;
void main() {
L=strlen(a);
for (i=1;i<=L;i++) {
for (j=0;j<=L-i;j++) {
for (k=j;k<j+i;k++) {
printf("%c",a[k]);
}
printf("\n");
}
}
}
turing-complete 2011-10-31
  • 打赏
  • 举报
回复
#include <iostream>

using namespace std;

int main()
{
char ch[]={'a','b','c','d','e','f','g','h','\0'};
int num = sizeof(ch);
int start, len, k;
for(start = 0; start < num; ++start)
{// 各种起始字符
for(len = 1; len < num - start; ++len)
{// 各种长度
for(k = 0; k < len; k++)
cout << ch[start + k];
cout << endl;
}
}
return 0;
}
夏夏夏奇 2011-10-31
  • 打赏
  • 举报
回复
这是我按你的代码改的:

#include<iostream>
using namespace std;
int main()
{
char ch[]={'a','b','c','d','e','f','g','h','\0'};
int num=sizeof(ch)/sizeof(char);
int i,j,k;
for(i=0;i<num;i++)
{
for(j=0;j<num-i-1;j++)
{
for(k=0;k<=j&&(i+k)<num;k++)
cout<<ch[i+k];
cout<<endl;
}
}
return 0;
}

你自己在运行下看看。
测试NULL 2011-10-31
  • 打赏
  • 举报
回复
其实你已经接近正确答案了,只需要多申明一个变量就OK了,帮你改好了
如果有其他问题加我Q: 506341588

#include "stdafx.h"
#include<iostream>
using namespace std;
int main()
{
char ch[]={'a','b','c','d','e','f','g','h','\0'};
int num=sizeof(ch)/sizeof(char);
int i,j,k, step;
for(i=0;i<num;i++)
{
for(j=i;j<num;j++)
{
for(k=i, step=0;k<j && i+step<num;k++, step++)
cout<<ch[i+step];
cout<<endl;
}
}
return 0;
}
某某某 2011-10-31
  • 打赏
  • 举报
回复
把你的循环改一下:
for(i=0;i<num;i++)
{
//cout << "i=" <<i << endl;
for(j=i;j<num;j++)
{
//cout << "j=" <<j << endl;
for(k=i;k<=j;k++)
cout<<ch[k];
cout<<endl;
}
}
是你搞复杂了。
顺便把ch中最后一个字符\0去掉,否则你也会看到重复输出。因为输出后\0不会显示,

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧