user-0 提问: 关于求子串的算法，我写了代码，为什么运行是这样的？

回复:
user: user-1
content: 建议单步跟踪程序运行，观察每一步所得结果是否与你期望一致

user: user-2
content: 你这个str_sub函数里，最后的while循环里while (p != NULL&&t != len) 你一直让q->ch = p->ch;有什么用？q不需要移动？

user: user-0
content: 谢谢大家了！

user: user-0
content: 引用 11 楼 lzhui1987 的回复: typedef struct node { 	char ch; 	struct node *next; }STRNODE;                      //串的链式存储结构表示  int str_len(STRNODE *s)            //串的长度计算函数/ { 	return s->ch; }  void str_input(STRNODE *s)          //串的输入函数/ { 	int i=0; 	char ch; 	STRNODE *p,*q; 	p=s; 	q=s->next; 	s->ch=0; 	while((ch=getchar())!='\n')         //通过循环，从键盘输入一串字符串 	{ 		q=(STRNODE *)malloc(sizeof(STRNODE)); 		q->ch=ch; 		q->next=NULL; 		p->next=q; 		p=q; 		s->ch++; 	} } STRNODE *str_sub(STRNODE *sub,STRNODE *s,int pos,int len) {//将串s第pos个字符开始的长度为len的字符序列复制到串sub中 	STRNODE *q,*p,*temp; 	int i=0,t=0; 	p=s->next; 	q=(STRNODE *)malloc(sizeof(STRNODE)); 	//q=sub->next; 	while(p!=NULL&&i!=pos) 	{ 		i++; 		p=p->next; 	} 	while(p!=NULL&&t!=len) 	{ 		q->ch=p->ch; 		temp=(STRNODE *)malloc(sizeof(STRNODE)); 		q->next=temp; 		p=p->next; 		 		//sub->ch=t; 		if(t==0) 			sub=q; 		 		t++; 		if(t!=len) 			q=q->next; 		else 			q->next=NULL; 			 	} 	return sub; } void str_print(STRNODE *s) {//字符串输出显示 	int i; 	STRNODE *p; 	p=s; 	for(i=0;i<s->ch;i++) 	{ 		putchar(p->ch); 		p=p->next; 	} 	printf("\n"); } int _tmain() { 	int position,length,no; 	STRNODE str,str1,str2; 	str.ch=0; 	str1.ch=0,str2.ch=0; 	printf("请输入一串字符："); 	fflush(stdin); 	str_input(&str1); 	printf("请输入取子串的位置和长度："); 	scanf("%d%d",&position,&length); 	str=*(str_sub(&str,&str1,position,length)); 	printf("子串为："); 	str_print(&str); }  和你的比较下，哪里不同，我这个运行正常。 恩，谢谢你的程序，不过我运行后是这样的，不知道是不是编译软件的缘故。 然后在你的想法帮助下，我改了一点点，可以运行了，我改动后的程序这样的，你可以看下。 最后还是要谢谢你，帮我解决了这些天一来的问题。

user: user-3
content: typedef struct node { 	char ch; 	struct node *next; }STRNODE;                      //串的链式存储结构表示  int str_len(STRNODE *s)            //串的长度计算函数/ { 	return s->ch; }  void str_input(STRNODE *s)          //串的输入函数/ { 	int i=0; 	char ch; 	STRNODE *p,*q; 	p=s; 	q=s->next; 	s->ch=0; 	while((ch=getchar())!='\n')         //通过循环，从键盘输入一串字符串 	{ 		q=(STRNODE *)malloc(sizeof(STRNODE)); 		q->ch=ch; 		q->next=NULL; 		p->next=q; 		p=q; 		s->ch++; 	} } STRNODE *str_sub(STRNODE *sub,STRNODE *s,int pos,int len) {//将串s第pos个字符开始的长度为len的字符序列复制到串sub中 	STRNODE *q,*p,*temp; 	int i=0,t=0; 	p=s->next; 	q=(STRNODE *)malloc(sizeof(STRNODE)); 	//q=sub->next; 	while(p!=NULL&&i!=pos) 	{ 		i++; 		p=p->next; 	} 	while(p!=NULL&&t!=len) 	{ 		q->ch=p->ch; 		temp=(STRNODE *)malloc(sizeof(STRNODE)); 		q->next=temp; 		p=p->next; 		 		//sub->ch=t; 		if(t==0) 			sub=q; 		 		t++; 		if(t!=len) 			q=q->next; 		else 			q->next=NULL; 			 	} 	return sub; } void str_print(STRNODE *s) {//字符串输出显示 	int i; 	STRNODE *p; 	p=s; 	for(i=0;i<s->ch;i++) 	{ 		putchar(p->ch); 		p=p->next; 	} 	printf("\n"); } int _tmain() { 	int position,length,no; 	STRNODE str,str1,str2; 	str.ch=0; 	str1.ch=0,str2.ch=0; 	printf("请输入一串字符："); 	fflush(stdin); 	str_input(&str1); 	printf("请输入取子串的位置和长度："); 	scanf("%d%d",&position,&length); 	str=*(str_sub(&str,&str1,position,length)); 	printf("子串为："); 	str_print(&str); }  和你的比较下，哪里不同，我这个运行正常。

user: user-4
content: #include <stdio.h> #include <stdlib.h> #include <string.h>  #define N 100   typedef struct node { 	char ch; 	struct node *next; }Lnode,*linklist;  int main () { 	int i=1,len,pos,len1; 	char a[N]={0},b[N]={0}; 	linklist s,p; 	Lnode *q,*L; 	 	printf("请输入一段字符串:"); 	scanf("%s",a); 	printf("%s\n",a); 	if(a[0]==NULL) 		return 0; 	len=strlen(a); 	printf("%d\n",len);  	L=(Lnode *)malloc(sizeof(Lnode)); 	q=(Lnode *)malloc(sizeof(Lnode)); 	q->ch=a[0]; 	q->next=NULL; 	L->next=q; 	L->ch=len; 	s=q; 	p=L; 	   	while (i<len)      	{ 		q=(Lnode *)malloc(sizeof(Lnode)); 		q->ch=a[i]; 		q->next=NULL; 		s->next=q; 		s=q; 		i++; 	} 	printf("请输入插入的位置及长度："); 	scanf("%d%d",&pos,&len1); 	 	for(int j=0;j<pos;p=p->next,j++); 	for(i=0;i<len1;i++) 	{ 		b[i]=p->ch; 		p=p->next; 	} 	printf("%s",b); 	return 0; }

user: user-0
content: 引用 8 楼 小灸舞的回复:你这个str_sub函数里，最后的while循环里while (p != NULL&&t != len) 你一直让q->ch = p->ch;有什么用？q不需要移动？ 想在定位后，将len长度的字符赋给新的链sub，应该怎么做啊

user: user-0
content: 引用 5 楼 qq_36409192 的回复:[quote=引用 4 楼 unxglwy 的回复:] [quote=引用 2 楼 qq_36409192 的回复:] 程序有点混乱，看出了这么几个问题： 1.getchar的用法问题，getchar的返回值是一个int型的值，而不是char型。 2.你的i,t没初始化，然后你就直接自增了。 3.你的s的next为空，然后你又q=s->next。 4.结点中声明了一个char ch,然后你又在str_input里面又声明了同样的char ch。  ps:比较急，可能还有的问题没看出来。 谢谢你的意见，但是光从问题来说，我还是不知道从哪里去改[/quote] 你这个程序得大改，问题有点多，建议你重新写一下。[/quote] 现在把代码改成这样，但是还是运行不了，帮忙看下 #include<stdio.h> #include<stdlib.h> //#define NULL 0 typedef struct node { 	char ch; 	int len; 	struct node *next; }STRNODE;                 //串的链式存储结构表示 int str_len(STRNODE *s) {     return s->len; } void str_input(STRNODE *s) {     char ch;     STRNODE *p,*q;     p=s;     q=s->next;     s->len=0;     while((ch=getchar())!='\n')     {         q=(STRNODE*)malloc(sizeof(STRNODE));         q->ch=ch;         q->next=NULL;         p->next=q;         p=q;         s->len++;     } } void str_sub(STRNODE *sub,STRNODE *s,int pos,int len) {     STRNODE *p,*q;     int i=0,t=0;     p=s->next;     q=sub;     while(p!=NULL&&i!=pos)     {         i++;         p=p->next;     }     while(p!=NULL&&t!=len)     {         q->ch=p->ch;         p=p->next;         q->len++;         t++;     } } void str_output(STRNODE *s) {     STRNODE *p;     p=s->next;     int i;     for(i=0;i<str_len(s);i++)     {         putchar(p->ch);         p=p->next;     }     printf("\n"); } int main() {     STRNODE str,str1;     int pos,len;     printf("请输入一段字符串:");     str_input(&str1);     printf("请输入插入的位置及长度：");     scanf("%d %d",&pos,&len);     str_sub(&str,&str1,pos,len);     printf("子串为：");     str_output(&str);     return ; }

user: user-4
content: 引用 4 楼 unxglwy 的回复:[quote=引用 2 楼 qq_36409192 的回复:] 程序有点混乱，看出了这么几个问题： 1.getchar的用法问题，getchar的返回值是一个int型的值，而不是char型。 2.你的i,t没初始化，然后你就直接自增了。 3.你的s的next为空，然后你又q=s->next。 4.结点中声明了一个char ch,然后你又在str_input里面又声明了同样的char ch。  ps:比较急，可能还有的问题没看出来。 谢谢你的意见，但是光从问题来说，我还是不知道从哪里去改[/quote] 你这个程序得大改，问题有点多，建议你重新写一下。

user: user-0
content: 引用 2 楼 qq_36409192 的回复:程序有点混乱，看出了这么几个问题： 1.getchar的用法问题，getchar的返回值是一个int型的值，而不是char型。 2.你的i,t没初始化，然后你就直接自增了。 3.你的s的next为空，然后你又q=s->next。 4.结点中声明了一个char ch,然后你又在str_input里面又声明了同样的char ch。  ps:比较急，可能还有的问题没看出来。 谢谢你的意见，但是光从问题来说，我还是不知道从哪里去改

user: user-0
content: 引用 1 楼 paschen 的回复:你str_sub函数中的变量 i 和 t 没有初始化就使用了 sorry啊，初始化后还是运行不了。不过也很谢谢你的提醒

user: user-4
content: 程序有点混乱，看出了这么几个问题： 1.getchar的用法问题，getchar的返回值是一个int型的值，而不是char型。 2.你的i,t没初始化，然后你就直接自增了。 3.你的s的next为空，然后你又q=s->next。 4.结点中声明了一个char ch,然后你又在str_input里面又声明了同样的char ch。  ps:比较急，可能还有的问题没看出来。

user: user-1
content: 你str_sub函数中的变量 i 和 t 没有初始化就使用了