鱼C论坛

 找回密码
 立即注册
查看: 1309|回复: 12

[已解决]萌新求助(for循环问题)

[复制链接]
发表于 2021-10-9 16:41:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
这个是错误的
#include <stdio.h>
#include <string.h>

int main()
{
    char a[5000],b[5000];

    scanf("%s",&a);

    int n,i,j;
    n=strlen(a);
    j=n;
    for(i=0;i<j;i++)
    {
        b[i]=a[n-i-1];
    }
   printf("%s",b[5000]);

    return 0;
}
这个是正确的
#include <stdio.h>
#include <string.h>

int main()
{
    char a[5000],b[5000];

    scanf("%s",&a);

    int n,i,j;
    n=strlen(a);
    j=n;
    for(i=0;i<j;i++)
    {
        b[i]=a[n-i-1];
        printf("%c",b[i]);
    }
    return 0;
}

为什么循环外不能一起输出而非要单个单个的输出
最佳答案
2021-10-9 21:43:56
这串代码是想把输入的字符串反转吧,我改了一下
#include <stdio.h>
#include <string.h>

int main()
{
    char a[5000],b[5000];

    scanf("%s",a);

    int n,i,j;
    n=strlen(a);
    j=n;
    for(i=0;i<j;i++)
    {
        b[i]=a[n-i-1];
    }
        b[n]='\0';
        printf("%s",b);
    return 0;
}
先说一下你发的正确的那串代码,第一个问题就是上面老哥写的b[n]='\0'  有了'\0'数组b才是字符串数组,没有就是一个字符数组
第二个问题就是printf写在循环里面了,鉴于你想问的问题情有可原,在改好第一个问题后数组b是字符串数组,字符串数组的数组名是一个地址,指向这个数组第一个字符。而%s接收的是一个地址,所以说应该把%c改为%s,在后面只需要写数组名b就行了,%s接收到地址后会按照地址打印出这个字符串(字符串在内存中的地址都是连续的),遇到'\0'停止。
第三个问题就是你的scanf  scanf("%s",&a);
前面的课程在接受变量比如说接收一个整型变量:
int a;
scanf("%d",&a);
a是取地址符,作用是获得a的地址,scanf接收到字符后会按照a的地址把输入的数值放到变量a里,所以scanf括号里的逗号后面跟的是地址,那么上面已经讲过了,数组名就是数组首元素的地址,所以说只需要写a,并不需要&a
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-10-9 17:41:22 | 显示全部楼层
 for(i=0;i<j;i++)
    {
        b[i]=a[n-i-1];
    }
    b[i]='\0';///////////////////
   printf("%s",b[5000]);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-9 21:43:56 | 显示全部楼层    本楼为最佳答案   
这串代码是想把输入的字符串反转吧,我改了一下
#include <stdio.h>
#include <string.h>

int main()
{
    char a[5000],b[5000];

    scanf("%s",a);

    int n,i,j;
    n=strlen(a);
    j=n;
    for(i=0;i<j;i++)
    {
        b[i]=a[n-i-1];
    }
        b[n]='\0';
        printf("%s",b);
    return 0;
}
先说一下你发的正确的那串代码,第一个问题就是上面老哥写的b[n]='\0'  有了'\0'数组b才是字符串数组,没有就是一个字符数组
第二个问题就是printf写在循环里面了,鉴于你想问的问题情有可原,在改好第一个问题后数组b是字符串数组,字符串数组的数组名是一个地址,指向这个数组第一个字符。而%s接收的是一个地址,所以说应该把%c改为%s,在后面只需要写数组名b就行了,%s接收到地址后会按照地址打印出这个字符串(字符串在内存中的地址都是连续的),遇到'\0'停止。
第三个问题就是你的scanf  scanf("%s",&a);
前面的课程在接受变量比如说接收一个整型变量:
int a;
scanf("%d",&a);
a是取地址符,作用是获得a的地址,scanf接收到字符后会按照a的地址把输入的数值放到变量a里,所以scanf括号里的逗号后面跟的是地址,那么上面已经讲过了,数组名就是数组首元素的地址,所以说只需要写a,并不需要&a
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-9 22:24:41 | 显示全部楼层
bszs 发表于 2021-10-9 21:43
这串代码是想把输入的字符串反转吧,我改了一下
先说一下你发的正确的那串代码,第一个问题就是上面老哥写 ...

谢谢大佬,看了半天才看懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-9 22:38:20 | 显示全部楼层
bszs 发表于 2021-10-9 21:43
这串代码是想把输入的字符串反转吧,我改了一下
先说一下你发的正确的那串代码,第一个问题就是上面老哥写 ...

char d[] = ("FishC", "is", "Good!")
大佬,请问这个定义哪里错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-9 23:48:26 | 显示全部楼层
一只学C的萌新 发表于 2021-10-9 22:38
char d[] = ("FishC", "is", "Good!")
大佬,请问这个定义哪里错了

char d[]是字符数组,里面只能放字符,或者一个字符串,
char d[]={'a','b','c','\0'};
就像上面这样每一个字符用单引号隔开,带\0表示是一个字符串;
而一个字符串相当于一个字符数组,其数组名相当于第一个字符的的地址,如果说用一个d[]数组来包含三个数组"FishC", "is", "Good!"的话是不行的,需要d[3][100]
把数组d定义为二维数组才行
也就是d[3][10]={
        {"FishC"},
        { "is"},
        {"Good!"}
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-10 00:07:32 | 显示全部楼层
bszs 发表于 2021-10-9 23:48
char d[]是字符数组,里面只能放字符,或者一个字符串,
char d[]={'a','b','c','\0'};
就像上面这样每 ...

仔细想一下,你把字符串当成一个一维数组,是不是要用二维数组来包含这个一维数组
比如说上面的d[3][10],第一个下标[3]表示有三个数组,第二个下标[10]表示每个数组包含的元素数量
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-10 00:25:22 | 显示全部楼层
bszs 发表于 2021-10-10 00:07
仔细想一下,你把字符串当成一个一维数组,是不是要用二维数组来包含这个一维数组
比如说上面的d[3][10] ...

还有一点忘了说了,char d[] = ("FishC", "is", "Good!")这除了要改成二维数组外,小括号也要改成大括号
而且
char d[3][10]={
        {"FishC"},
        { "is"},
        {"Good!"}
   }
输出时可以printf("%s",d[2]);
这里的d[2]表示第三个字符串(把他当成数组)的数组名,同理,你还可以改成d[1],d[0]
换一种思路,定义一种整形二维数组:
int a[2][3]={
        {1,2,3},
        {4,5,6}
}
a[2][3]是一个两行三列的二维数组,我们把每一行当成一个一维数组,每一个数组包含三个int 元素
:{1,2,3}是一个数组,对应为a[0][0],a[0][1],a[0][2]
{4,5,6}为一个数组,对应为a[1][0],a[1][1],a[1][2]
其中a[0]可以当成a[0][0],a[0][1],a[0][2]这个数组的数组名,同理a[1]可以当成a[1][0],a[1][1],a[1][2]这个数组的数组名
那么再回到
char d[3][10]=
{
        {"FishC"},
        { "is"},
        {"Good!"}
}
把每一个字符串当成一个数组,你总不能用一个一维数组来包含三个一维数组
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-10 00:34:07 | 显示全部楼层
bszs 发表于 2021-10-10 00:25
还有一点忘了说了,char d[] = ("FishC", "is", "Good!")这除了要改成二维数组外,小括号也要改成大括号
...

如果你学到指针的话,定义一个指针数组:
char *d[3]= {
"FishC", "is", "Good!"};
printf("%s"d[0]);
这里每一个存在d[3]里的字符串实际上就是首字符的地址。
当然这都是后话了,你学到指针数组与数组指针的时候可以回过来看看
如果还有什么不懂的话加我好友,我也是初学者,只不过学的比你快一点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-10 16:55:22 | 显示全部楼层
bszs 发表于 2021-10-10 00:34
如果你学到指针的话,定义一个指针数组:
char *d[3]= {
"FishC", "is", "Good!"};

谢谢大佬,昨天我没有完全看懂,今天把二维数组的课听了一遍之后差不多看懂了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-10 16:57:29 | 显示全部楼层
bszs 发表于 2021-10-10 00:34
如果你学到指针的话,定义一个指针数组:
char *d[3]= {
"FishC", "is", "Good!"};

我还没有加好友的权限,
这知识量比我多多了,我指针都没学到,来自大佬的谦虚
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-10 23:24:31 | 显示全部楼层
bszs 发表于 2021-10-9 21:43
这串代码是想把输入的字符串反转吧,我改了一下
先说一下你发的正确的那串代码,第一个问题就是上面老哥写 ...

我还差30积分才能添加好友
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-10 23:47:34 | 显示全部楼层
慢慢学吧,我学的够慢的了,论坛里大佬多,多问就行,希望你学到指针的时候不要被吓退,能够坚持下来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-22 14:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表