为什么这段代码打印相同的东西5次?

时间:2018-03-11 16:12:42

标签: c string pointers multidimensional-array

#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次。我该如何修复该代码?

3 个答案:

答案 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)存储在最后一个字符之后   缓冲区。