指向字符串字符的指针数组

迪佩什·库马尔·古普塔

当输入为 5 时,而不是要求 5 个字符串,它只需要 4 个,为什么会这样? 为什么默认*a+0 = '\n'保存? 我也试过scanf("%d %c", &n &ch )在第 9 行,但问题是一样的。

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

int main()
    {
        int n;
        char ch;
        printf("no of elements\n");
        scanf("%d ", &n ); //line 9
        //asking for number of pointer in array 
        char *a[n];
        puts("string");
        for (int i = 0; i < n; ++i){
            gets(a+i);
        }
        puts("-----");
        for (int j = 0; j < n; ++j){
            puts(a+j);
        }
        puts("-----");
        puts(a);
        puts("-----");
        puts(a+2);

        return 0;
    }
来自莫斯科的弗拉德

对于根据 C 标准的初学者,不带参数的函数 main 应声明为

int main( void )

本声明中声明的变量

char ch;

未在程序中使用,应删除。

并且<string.h>您的程序中没有使用头文件中的声明所以标题可以被删除。

您声明了一个指向该类型的指针的可变长度数组 char

char *a[n];

但是,数组的元素未初始化并且具有不确定的值。结果,由于 for 循环中的此语句,程序具有未定义的行为

gets(a+i);

您必须为要输入的每个字符串分配内存。

还要考虑到该函数gets是不安全的,C 标准不再支持该函数而是使用函数fgets此外,函数调用中的参数必须是*( a + i )而不是,a + i因为最后一个表达式的类型char **不是所需的类型char *

因此,有效的代码可以通过以下方式查找示例

#include <stdio.h>
#include <stdlib.h>

int main( void )
{
    size_t n;
    const size_t SIZE = 20;

    printf( "no of elements: " );

    if ( scanf( "%zu%*c", &n ) != 1 || n == 0 ) n = 1;

    char * a[n];

    for ( size_t i = 0; i < n; i++ )
    {
        *( a + i ) = malloc( SIZE );    
    }

    puts("string");

    for ( size_t i = 0; i < n; ++i )
    {
        fgets( *( a + i ), SIZE, stdin );
    }

    puts("-----");

    for ( size_t i = 0; i < n; ++i )
    {
        printf( "%s", *( a + i ) );
    }

    puts( "-----" );
    printf( "%s", *a );

    puts( "-----" );
    printf( "%s", *( a + 2 ) );

    for ( size_t i = 0; i < n; i++ )
    {
        free( *( a + i ) );
    }

    return 0;
}

它的输出可能看起来像

no of elements: 5
string
A
B
C
D
E
-----

A
B
C
D
E
-----
A
-----
C

注意这个声明

    if ( scanf( "%zu%*c", &n ) != 1 || n == 0 ) n = 1;

n使用格式说明符读取变量后,&zu您需要从输入缓冲区中删除与按下的 Enter 键对应的换行符。否则下一次调用fgets将读取一个空字符串。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

指向字符串数组的指针数组

来自分类Dev

指向字符串的指针数组

来自分类Dev

保存指针指向数组的字符串

来自分类Dev

指向字符串数组的指针

来自分类Dev

指向C ++中的字符串指针数组的指针

来自分类Dev

c指向字符串数组的指针数组

来自分类Dev

Ctypes和指向字符串数组的指针

来自分类Dev

Ctypes和指向字符串数组的指针

来自分类Dev

分段错误:指向字符串数组的指针

来自分类Dev

C - 指向字符串数组的指针不起作用

来自分类Dev

指向字符串的C数组,从指针传递字符串

来自分类Dev

指向(定义了指针数组)字符串的指针数组:字符串是否按顺序存储在内存中?

来自分类Dev

获取指向字符串常量的指针

来自分类Dev

指向函数中字符串的指针

来自分类Dev

指向子字符串的C ++指针

来自分类Dev

函数返回指向字符串的指针

来自分类Dev

从指向字符的指针数组中的字符串中保存数字(数字序列)

来自分类Dev

如何在C中创建(和使用)指向字符串数组的指针数组?

来自分类Dev

使用指针指向字符串中的某些字符

来自分类Dev

如何更改字符串指针指向的字符?

来自分类Dev

为什么这样起作用:指向C字符串的指针数组?

来自分类Dev

逐步完成指向字符串的指针数组-“需要左值作为增量操作数”

来自分类Dev

修正:访问冲突读取位置(指向字符串数组的指针)

来自分类Dev

执行指向字符串C数组的指针时出现段错误

来自分类Dev

如何在指向字符串的指针数组中将首字母更改为大写?

来自分类Dev

C:生成,传递和访问指向const字符串的const指针数组

来自分类Dev

为什么这样起作用:指向C字符串的指针数组?

来自分类Dev

修正:访问冲突读取位置(指向字符串数组的指针)

来自分类Dev

如何在C中返回指向字符串数组的指针

Related 相关文章

  1. 1

    指向字符串数组的指针数组

  2. 2

    指向字符串的指针数组

  3. 3

    保存指针指向数组的字符串

  4. 4

    指向字符串数组的指针

  5. 5

    指向C ++中的字符串指针数组的指针

  6. 6

    c指向字符串数组的指针数组

  7. 7

    Ctypes和指向字符串数组的指针

  8. 8

    Ctypes和指向字符串数组的指针

  9. 9

    分段错误:指向字符串数组的指针

  10. 10

    C - 指向字符串数组的指针不起作用

  11. 11

    指向字符串的C数组,从指针传递字符串

  12. 12

    指向(定义了指针数组)字符串的指针数组:字符串是否按顺序存储在内存中?

  13. 13

    获取指向字符串常量的指针

  14. 14

    指向函数中字符串的指针

  15. 15

    指向子字符串的C ++指针

  16. 16

    函数返回指向字符串的指针

  17. 17

    从指向字符的指针数组中的字符串中保存数字(数字序列)

  18. 18

    如何在C中创建(和使用)指向字符串数组的指针数组?

  19. 19

    使用指针指向字符串中的某些字符

  20. 20

    如何更改字符串指针指向的字符?

  21. 21

    为什么这样起作用:指向C字符串的指针数组?

  22. 22

    逐步完成指向字符串的指针数组-“需要左值作为增量操作数”

  23. 23

    修正:访问冲突读取位置(指向字符串数组的指针)

  24. 24

    执行指向字符串C数组的指针时出现段错误

  25. 25

    如何在指向字符串的指针数组中将首字母更改为大写?

  26. 26

    C:生成,传递和访问指向const字符串的const指针数组

  27. 27

    为什么这样起作用:指向C字符串的指针数组?

  28. 28

    修正:访问冲突读取位置(指向字符串数组的指针)

  29. 29

    如何在C中返回指向字符串数组的指针

热门标签

归档