C语言 如何存储用户输入的字符串并将其存储在指针数组中?

dced5bon  于 2023-01-20  发布在  其他
关注(0)|答案(1)|浏览(295)

在我的代码中,我试图从用户那里获取字符串作为输入,并将它们存储在指针数组中。但是,我的代码只存储指针数组所有元素中最后输入的字符串。我必须做什么修改?
我的代码是:

#include <stdio.h>
#include <string.h>

void main()
{
    char *names[ 4 ], name[ 10 ];

    for ( int i = 0; i < 4; i++ ) {
    
        printf( "Enter your name: " );
        scanf( "%s", name );
        names[ i ] = name;
    }

    for ( int i = 0; i < 4; i++ )
        printf( "\n* %s", names[ i ] );
}

输出为:
请输入您的姓名:请输入您的姓名:请输入您的姓名:请输入您的姓名:雅各布

  • 雅各布
  • 雅各布
  • 雅各布
  • 雅各布
nhhxz33t

nhhxz33t1#

浅拷贝与深拷贝:

给定两个指针p和q,语句:

p = q;

不将q指向的内存内容复制到p指向的内存内容。它复制指针值,以便pq现在都指向同一内存,并且通过p对内存所做的任何更改都会在使用q时反映出来。这称为浅复制。
该声明

char *names[ 4 ];

声明一个指向char.NB的4个指针的数组,该数组仅为指针分配内存。
然后,在循环中:

for ( int i = 0; i < 4; i++ ) {
    
        printf( "Enter your name: " );
        scanf( "%s", name );
        names[ i ] = name;
}

将缓冲区name的地址分配给数组中的每个指针。

    • 问题:**最后一次迭代后name的内容是什么?
    • 答案:**雅各布。

在内存中,它看起来像这样:

names[0] ----
            |
names[1] ----
            |----> address of ```name```
names[2] ----
            |
names[3] ----

解引用并打印这些指针的内容,然后每次打印Jacob

    • 可能的修复方法:**
  • 按照注解的建议使用二维数组。
  • malloc为字符串分配内存,并将它们的地址赋给指针,然后可以使用strcpy或POSIX的strdup将缓冲区name的内容复制到每个指针所指向的内存区域(这被称为深度复制)。
  • 注意:* strdup使用malloc为字符串分配内存,所以不要忘记使用free

strdup()函数返回一个指向新字符串的指针,该字符串是字符串s的副本。新字符串的内存是通过malloc(3)获得的,并且可以通过free(3)释放。

main()的定义不正确

来自C11:
在程序启动时调用的函数名为main。实现没有为这个函数声明原型。它应该用int返回类型定义,并且没有参数:

int main (void) 
{ /* ... */ }

或者使用两个参数(这里称为argc和argv,尽管可以使用任何名称,因为它们对于声明它们的函数是局部的):

int main (int argc, char *argv[]) 
{ /* ... */ }

或同等产品;或以一些其它实施方式定义的方式。

缓冲区溢出漏洞:

scanf("%s", name);

相当于:

gets(name);

它会继续读取输入并使缓冲区溢出。
相反,请考虑使用fgets

fgets (name, sizeof (name), stdin);

fgets最多读取n - 1个字符,并以null结束字符串。
或者将宽度说明符与scanf一起使用:

scanf("%9s", name);

相关问题