程序为什么没有输出

陈思有 2011-04-09 12:48:19
#include <stdio.h>
#include <string.h>
void main()
{
char s[40],v[20],min;
int i,j;
char *p;

scanf("%s%s",s,v);
min = s[0];
for (i=0; s[i]!='\0'; i++)
{
if (s[i] < min)
p = &s[i];
}
j = strlen(v);
for (i=0; v[i]!='\0'||*(p+i+1)!='\0'; i++)
{
if (*(p+i) != '\0')
{
*(p+i+j+1) = *(p+i+1);
j++;
}
if (v[i] !='\0')
*(p+i+1) = v[i];
}
*(p+i+j+1) = '\0';
printf("%s\n",s);
}
...全文
263 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
matrixcl 2011-04-09
  • 打赏
  • 举报
回复
提题的技巧啊,至少说明你的代码是要用来干嘛的。

for (i=0; v[i]!='\0'||*(p+i+1)!='\0'; i++)
{
if (*(p+i) != '\0')
{
*(p+i+j+1) = *(p+i+1);
j++;
}
if (v[i] !='\0')
*(p+i+1) = v[i];
}

p的这些操作太依赖输入数据了,很容易越界访问,或者访问到未初始化的内存
無_1024 2011-04-09
  • 打赏
  • 举报
回复
  for (i=0; s[i]!='\0'; i++)
{
if (s[i] < min)
p = &s[i];
}//不知道这个地方是干啥的 总之错误在于对p的初始化赋值上面
luohaohahaha 2011-04-09
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 csiyou 的回复:]

C/C++ code
#include <stdio.h>
#include <string.h>
void main()
{
char s[40],v[20],min;
int i,j;
char *p;

gets(s);
gets(v);
min = s[0];
p = s;
for (i=1; s[i]!='\0'……
[/Quote]

#include <stdio.h>
#include <string.h>
void main()
{
char s[40],v[20],min;
int i,j,k,m;
char *p;

scanf("%s%s",s,v);
min = s[0];
p = s;
for (i=0; s[i]!='\0'; i++)
{
if (s[i] < min)
{
p = &s[i];
m = i;
}
else
{
m = 0; //-----------------> m记下最小字符所在位置。
}
}
j = strlen(v);
k = strlen(s);
//for (i=0; *(p+i+1)!='\0'; i++)
// *(p+i+j+1) = *(p+i+1);
for(i=k-1; i>m; i--)
{
*(p+j+i)=*(p+i);
}
*(p+k+j+1) = '\0';
for (i=0; v[i]!='\0';i++)
*(p+i+1) = v[i];


for (i=0; s[i] != '\0'; i++)
printf("%c",s[i]);
printf("\n");
}

不是给你改了嘛 。
陈思有 2011-04-09
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <string.h>
void main()
{
char s[40],v[20],min;
int i,j;
char *p;

gets(s);
gets(v);
min = s[0];
p = s;
for (i=1; s[i]!='\0'; i++)
{
if (s[i] < min)
{
p = &s[i];
min = s[i];
}
}
j = strlen(v);
for (i=0; *(p+i+1)!='\0'; i++)
*(p+i+j+1) = *(p+i+1);
*(p+i+j+1) = '\0';
for (i=0; v[i]!='\0';i++)
*(p+i+1) = v[i];


for (i=0; s[i] != '\0'; i++)
printf("%c",s[i]);
printf("\n");
return 0;
}



问题是有时候可以,有时候不可以,这是为什么
  • 打赏
  • 举报
回复
上面说错了一点,这永远还会结束改成永远不会结束
xici0088 2011-04-09
  • 打赏
  • 举报
回复
	j = strlen(v);
for (i=0; *(p+i+1)!='\0'; i++) //当s的字符串长度比v字符串长时,*(p+i+1)就永不等于'\0'.然后死循环,跃界.
{
*(p+i+j+1) = *(p+i+1);
}
*(p+i+j+1) = '\0';
  • 打赏
  • 举报
回复
定义数组时,没有初始化,为零, 而用FOR语句的时候,s[i]!='\0',这永远还会结束啊,这个条件始终成立
zhangyuehua123 2011-04-09
  • 打赏
  • 举报
回复
看不懂啊 注释!!
luohaohahaha 2011-04-09
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <string.h>
void main()
{
char s[40],v[20],min;
int i,j,k,m;
char *p;

scanf("%s%s",s,v);
min = s[0];
p = s;
for (i=0; s[i]!='\0'; i++)
{
if (s[i] < min)
{
p = &s[i];
m = i;
}
else
{
m = 0; //-----------------> m记下最小字符所在位置。
}
}
j = strlen(v);
k = strlen(s);
//for (i=0; *(p+i+1)!='\0'; i++)
// *(p+i+j+1) = *(p+i+1);
for(i=k-1; i>m; i--)
{
*(p+j+i)=*(p+i);
}
*(p+k+j+1) = '\0';
for (i=0; v[i]!='\0';i++)
*(p+i+1) = v[i];


for (i=0; s[i] != '\0'; i++)
printf("%c",s[i]);
printf("\n");
}

lz试试吧 。 找到最小字符时记下位置就方便多了.
陈思有 2011-04-09
  • 打赏
  • 举报
回复
哪位神人来回答一下
陈思有 2011-04-09
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <string.h>
void main()
{
char s[40],v[20],min;
int i,j;
char *p;

scanf("%s%s",s,v);
min = s[0];
p = s;
for (i=1; s[i]!='\0'; i++)
{
if (s[i] < min)
{
p = &s[i];
min = s[i];
}
}
j = strlen(v);
for (i=0; *(p+i+1)!='\0'; i++)
*(p+i+j+1) = *(p+i+1);
*(p+i+j+1) = '\0';
for (i=0; v[i]!='\0';i++)
*(p+i+1) = v[i];


for (i=0; s[i] != '\0'; i++)
printf("%c",s[i]);
printf("\n");
}


实在搞笑,为什么有的可以,有的不可以,都是任意输的
ruihuang 2011-04-09
  • 打赏
  • 举报
回复
看不懂
陈思有 2011-04-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 hujiey 的回复:]
这样该下 不过由于你用的是数组, 串不能太长否则会有错
for (i=0; s[i]!='\0'; i++)
{
if (s[i] < min)
{
p = &s[i];
min = s[i];
}
}
j = strlen(v);
for (i = 0;*(p+i+1)!='\0'; i++)
{
*(p+i+j+1) = *(p+i+1)……
[/Quote]


改成这样后有的可以有的不可以,都没超过字符串长度
陈思有 2011-04-09
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 g_spider 的回复:]
改了一下,因为空间足够也就不用再分配空间了。

C/C++ code
#include <stdio.h>
void main()
{
char s[40]={0},v[20]={0};
int i;
char *p,*q=v;

scanf("%s%s",s,v);
p=&s[0];//初始化
//找出s串中……
[/Quote]


这样的话s字符串后面的数据不是全部丢失了吗?
G_Spider 2011-04-09
  • 打赏
  • 举报
回复
改了一下,因为空间足够也就不用再分配空间了。
#include <stdio.h>
void main()
{
char s[40]={0},v[20]={0};
int i;
char *p,*q=v;

scanf("%s%s",s,v);
p=&s[0];//初始化
//找出s串中最小的字符,赋此字符的指针给p
for (i=0; s[i]!='\0'; i++)
{
if (s[i] < *p) //注意*p与min的区别
p = &s[i];
}
p++;
//将另一个字符串v放在一个字符串s中最小的字母的后面
for(;*q!=0;)
*p++=*q++;
*p=0;

printf("%s\n",s);
}
hujiey 2011-04-09
  • 打赏
  • 举报
回复
这样该下 不过由于你用的是数组, 串不能太长否则会有错
for (i=0; s[i]!='\0'; i++)
{
if (s[i] < min)
{
p = &s[i];
min = s[i];
}
}
j = strlen(v);
for (i = 0;*(p+i+1)!='\0'; i++)
{
*(p+i+j+1) = *(p+i+1);
}
*(p+i+j+1) = '\0';

for (i=0; v[i]!='\0' ; i++)
{

if (v[i] !='\0')
*(p+i+1) = v[i];
}
printf("%s\n",s);

[Quote=引用 6 楼 csiyou 的回复:]
将另一个字符串放在一个字符串中最小的字母的后面
[/Quote]
G_Spider 2011-04-09
  • 打赏
  • 举报
回复
*(p+i+j+1)会有越界错误,p=&s[0];//要初始化
之后可能还要扩展s[]串的空间以容纳串v
陈思有 2011-04-09
  • 打赏
  • 举报
回复
将另一个字符串放在一个字符串中最小的字母的后面
wenhongang 2011-04-09
  • 打赏
  • 举报
回复
读人家的代码很累的,提问也要技巧的,老大!至少说下代码的目的和关键地方代码是干嘛的吧,我真不知道你代码是干嘛的!
c/c++讨论群147325003,欢迎加群讨论
匚匚 2011-04-09
  • 打赏
  • 举报
回复
少用scanf,用fgets吧
加载更多回复(1)

69,371

社区成员

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

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