C语言,为什么只会输出最后一个字符串?

#include<stdio.h>
int main() {
int n;
char name[8],*names[10000];
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%s", &name);
names[i] = name;
}
for (int i = 0; i < n; i++) {
printf("%s\n", names[i]);
}
}

#include<stdio.h>

int main() {

int n;

char name[8],*names[10000];

scanf("%d", &n);

for (int i = 0; i < n; i++)

 {

scanf("%s", &name);

names[i]=name;//指针数组记录了name的n次地址,没有记录name的值;

}//name被赋了n次值 ,最后一次赋值把前面的赋值都覆盖了; 

for (int i = 0; i < n; i++) 

{

printf("%s\n",names[i]);//指针数组names中的所有的地址都是name首地址; 

}//又因为name的值最后一次赋值后的值;所以一直输出最后一次的赋值; 

}

——————————————————————————

下面是稍作修改的代码

#include<stdio.h>

int main() {

int n;

char name[8][1111],*names[10000];//将name改为二维数组 

scanf("%d",&n);

for(int i = 0; i < n; i++) 

{

scanf("%s",name[i]);//

names[i]=name[i];//

}

for(int i = 0; i < n; i++)

 {

printf("%s\n",names[i]);

}

}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2020-05-26
这样写代码也行那生产内存的厂家要倒闭,你所有输入的字符串都放在name里,后面的把前面的覆盖了,必须开辟新的内存保存新输入的字符串。或者用2维字符数组来保存。
第2个回答  2020-05-26
#include<stdio.h>
int main() {
int n;
//char name[8],*names[10000]; 这个有问题,没有分配空间
char names[100][100];
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%s", names[i]);
//names[i] = name;
}
for (int i = 0; i < n; i++) {
printf("%s\n", names[i]);
}
}
第3个回答  2020-05-26
scanf("%s",&name)这句话是错误的,name本身就是一个指针,前面不需要加&。改为:
scanf("%s",name);追问

names是指针,name不是

追答

name是指针,它是一个数组,数组名本身就是指针。

相似回答