C语言求助 for循环

#include<stdio.h>intmain(void){inti,j;charstr1[101],str2[101];printf("Pleaseinputastr... #include <stdio.h>

int main(void)
{
int i, j;
char str1[101], str2[101];

printf("Please input a string: ");
gets(str1);

for (i=0, j=0; str1[i]!='\0'; i++) //请问这里为什么只用定义j=0,而没有指明j的范围和,j++
{
if (str1[i] != '*')
{
str2[j] = str1[i];
j++;
}
}
str2[j] = '\0';
puts(str2);

return 0;
}
上面是标准答案
下面是我编写的,有错误清指出..
#include <stdio.h>
#include <string.h>

int main(void)
{
int i, j;
char str1[101]; str2[101];

printf("Please input a string: ");
gets(str1);

for (i = 0, j = 0; i <= (strlen(str1) - 1), j <= (strlen(str1) - 1; i++, j++)
{
if (str[i] != '*')
{
str2[j] = str1[i];
}
}
printf("%s", str);

return 0;
}
展开
 我来答
此处无名胜有名
2011-12-28 · TA获得超过506个赞
知道小有建树答主
回答量:272
采纳率:93%
帮助的人:118万
展开全部
原意解释为
// i为第一个字符串,从第一个字符到截止符('\0')做循环,寻找字符串中所有字符
// j为提取后的字符串(从第一个字符串中去掉'*'号的其他字符串)
// str1[i]!='\0' 为停止条件,即第一个字符串遇到'\0'停止
for (i=0, j=0; str1[i]!='\0'; i++)
{
if (str1[i] != '*') // 在第一个串中找不是*号的字符
{
str2[j] = str1[i]; // 找到后复制到第二个字符串中
j++; // 第二个字符序号串加1,不加1就重叠啦
}
}

你的原问题中问没有指定J范围,是因为要得到的字符串2是一个不固定长度的字符串,他是字符串1的一个子集,即str1 = 123**456**7\0 而字符串2即为 str2 = 1234567\0
第一个问题
如果按到你后写的写法结果应该是str2 = 123烫烫烫456烫烫烫7\0 原因是因为在str2第四个字符没有不是*号的时候你也给j做了一次++操作却没给str2[4]赋值
第二个问题
源代码循环结束是靠寻找\0结束的,也就是说原定义char str1[101], 不是循环101次而是在字符串中寻找\0直接结束
按你的写法可是寻找所有字符串长度,101个字符的所有长度都被你取出来了,如果没猜错你的结果应该是str2 = 123烫烫烫456烫烫烫7\0烫烫烫……烫,虽然显示的时候系统遇到了\0后会自动结束,但在循环里你还是多做了很多次循环
如果str1被写满,而你在循环结尾却做了一次strlen(str1) - 1,这样你后得到的字符串没有\0做为结尾后面会出现很多个"烫烫烫",而源代码中在结束前加了一句str2[j] = '\0';成功的避免了这类事情的发生.
第三个问题
char str1[101]; str2[101];
遇到分号即为定义结束,后面的str2[101]可就没定义了
不知道小生分析的对不对
更多追问追答
追问
\0只会出现在字符串的结尾吗?会不会出现在输入的字符串之间呢?..人为输入\0是怎么输入呢
追答
如果你想在字符串中间输入\0 需要在\前面再加一个\ ,这时候这个\叫做转译符 也就是写路径的时候为什么都需要写"D:\\新建文件夹\\测试" 这样的语句, 在字符串里像"\0"这样的东西有很多"\n"这个你认识吧,"回车", 但是你要想在字符串里输入就需要些 char * p = "\\n"; 第一个\是转译符.告诉系统我要输入一个特殊字符,第二个\告诉系统内容是\
在显示的时候就会显示"\n"
terranlong
2011-12-28 · TA获得超过7294个赞
知道大有可为答主
回答量:2660
采纳率:0%
帮助的人:3972万
展开全部
for (i=0, j=0; str1[i]!='\0'; i++) //请问这里为什么只用定义j=0,而没有指明j的范围和,j++
{
if (str1[i] != '*')
{
str2[j] = str1[i];
j++;
}
}

这个其实不是以 j 来约束的,你可以理解为:
j=0;
for (i=0; str1[i]!='\0'; i++) //请问这里为什么只用定义j=0,而没有指明j的范围和,j++
{
if (str1[i] != '*')
{
str2[j] = str1[i];
j++;
}
}
i 是一直变化的,但 j 要 if 才变化

我没有说过你上面那个是错的,只是相当于而已,继续你的补充来回答,给你的改了,看注释
#include <stdio.h>
#include <string.h>

int main(void)
{
int i, j;
char str1[101], str2[101]; //定义第二个变量,前面用逗号,不用分号

printf("Please input a string: ");
gets(str1);

j = 0; //j在这里定义为0
for (i = 0; i <= (strlen(str1) - 1); i++) //而j++就不要放for这里了
{
if (str1[i] != '*') //当不是*才给str2赋值
{
str2[j] = str1[i]; //str没定义啊,改str1
j++; //j++放到这里,
}
}
str2[j] = '\0'; //str2的最后加一个'\0'作为字符串的结束标志
printf("%s", str2); //把str2打印出来,不是str

return 0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
1239388231
2011-12-28 · 超过44用户采纳过TA的回答
知道小有建树答主
回答量:136
采纳率:0%
帮助的人:103万
展开全部
#include <stdio.h>
#include <string.h>

int main(void)
{
int i, j;
char str1[101],str2[101]; //“,”打错为“;”

printf("Please input a string: ");
gets(str1);

for (i = 0, j = 0; i<=(strlen(str1) - 1),j<=strlen(str1) - 1; i++,j++)
// j<=(strlen(str1) - 1; 错误
{
if (str1[i] != '*') //if (str[i] != '*')错误;
{
str2[j] = str1[i];
}
}
str2[j]='\0'; //缺少会导致输出错误
printf("%s", str2);
return 0;
}
你的逻辑是没有错误的,只是语法错误。
追问
\0 这个东西还没有搞懂,,那不是不能用strlen来算字符串的长度了? 还有最后那里str2[j] = '\0'; 这里怎么添加到字符串结尾去的呢
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
yj021321
2011-12-28 · 超过23用户采纳过TA的回答
知道答主
回答量:108
采纳率:0%
帮助的人:58.1万
展开全部
问:请问这里为什么只用定义j=0,而没有指明j的范围和,j++?
先回答你第一个问题,仔细看循环内部
if (str1[i] != '*')
{
str2[j] = str1[i];
j++;
}
j++ 已经 给了它递增语句,当str1[i] != '*' 为 false 的时候 就跳出循环,j 也就没有必要给他范围
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式