#include <stdio.h>
#include <stdlib.h>
int main(){
char name[50];
char *top5[5] = {"user1" , "user2" , "user3" , "user4" , "user5"};
int i ;
for(i=0;i<5;i++){
printf("You entered the top5. Please enter your name: ");
scanf("%s", &name);
top5[i] = name;
}
for(i=0;i<5;i++){
printf("%s" , top5[i]);
}
}
我希望它能打印5
个不同的名称,因为我在运行代码时使用了5
个不同的名称。但它总是打印我使用的姓氏。它打印5
次。我该如何修复该代码?
答案 0 :(得分:1)
对于根据C标准的初学者,不带参数的函数main
应声明为
int main( void )
在循环体中的这个语句之后
top5[i] = name;
数组top5
的每个元素都指向数组name
的第一个字符。
您可以声明二维字符arrray,而不是使用指针数组。
与格式说明符%s
一起使用的函数scanf不安全。此外,参数应指定为name
而不是&name
。
您可以使用标准函数fgets
代替scanf
。
这是一个演示程序,显示了如何编写原始程序。
#include <stdio.h>
#include <string.h>
#define N 20
int main( void )
{
char name[N];
char top5[][N] =
{
"user1" , "user2" , "user3" , "user4" , "user5"
};
const size_t M = sizeof( top5 ) / sizeof( *top5 );
for ( size_t i = 0; i < M; i++ )
{
printf("You entered the top5. Please enter your name: ");
fgets( name, sizeof( name ), stdin );
name[ strcspn( name, "\n" ) ] ='\0';
strcpy( top5[i], name );
}
for ( size_t i = 0; i < M; i++ )
{
puts( top5[i] );
}
}
答案 1 :(得分:0)
因为你使所有指针top5
指向非常相同的数组。
对于一个简单的解决方案,将top5
数组数组和copy放入嵌套数组中。
答案 2 :(得分:-1)
top5[i] = name
是错的。
您要找的是char *strcpy(char *dest, const char *src)
strcpy()
函数将src指向的字符串(包括终止空字节('\0'
))复制到dest指向的缓冲区。字符串可能不重叠,目标字符串dest必须足够大才能接收副本。
为了解决这个问题,只需
strcpy(top5[i], name)
此外,为防止缓冲区溢出,您不应使用scanf()
,而应使用char *fgets(char *s, int size, FILE *stream)
fgets()
从流和中读取最多一个小于大小的字符 将它们存储到s指向的缓冲区中。读后停止了EOF
或换行符。如果读取换行符,则将其存储到缓冲区中。 终止空字节(\0
)存储在最后一个字符之后 缓冲区。