字符串字符的指针数组

时间:2017-10-18 14:13:17

标签: c arrays sorting pointers dynamic-memory-allocation

当输入为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 )

2 个答案:

答案 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的下一次调用将读取一个空字符串。