gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 18:48:04 25 4
gpt4 key购买 nike

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

    #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将读取一个空字符串。

关于c - 指向字符串字符的指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46812293/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com