当输入为 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] 删除。
我来说两句