当输入为5时,而不是要求5个字符串只需要4个,为什么会这样?
为什么默认 public static void RecepcionMensajes(TextBox textBox)
{
if (client.Connected == true)
{
try
{
string fifo = Conexion.STR.ReadLine();
Queue mensajes = new Queue();
//Aquí se ponen en cola los mensajes que van llegando, utilizando el sistema FIFO.
mensajes.Enqueue(fifo);
string values = mensajes.Dequeue().ToString();
textBox.Invoke(new MethodInvoker(delegate () { textBox.AppendText("Exemys : " + values.Substring(2) + Environment.NewLine); }));
已保存?
我在第9行也试过*a+0 = '\n'
,但问题是一样的。
scanf("%d %c", &n &ch )
答案 0 :(得分:1)
你可能想要这个:
#include <stdio.h>
#include <string.h>
int main()
{
int n;
printf("no of elements\n");
scanf("%d", &n); // No space after the %d !
char dummy[2]; // these 2 lines are needed for absorbing the leftover
fgets(dummy, 2, stdin); // \n from scanf (mixing fgets and scanf is a bad idea)
char *a[n]; // here we'll have an array of n pointers to char. For the moment
// the array is not initialized and the pointers point nowhere
puts("string");
for (int i = 0; i < n; ++i) {
a[i] = malloc(100); // allocate memory for a string of a maximum length of 99.
// + one char for the NUL terminator
// Allocating a fixed size is awkward, but it will
// do here for demonstration purposes
fgets(a[i], 100, stdin); // limit the length of string to 100 in order
// to avoid buffer overflow
// it's basically the same as gets(buffer)
}
puts("-----");
for (int j = 0; j < n; ++j) {
puts(a[j]);
}
puts("-----");
puts(a[0]);
puts("-----");
puts(a[2]);
return 0;
}
输入和输出:
no of elements
3
string
11
22
33
-----
11
22
33
-----
11
-----
33
为简洁起见,避免了错误检查。
答案 1 :(得分:1)
对于根据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
的下一次调用将读取一个空字符串。