为获取分配空字符串

Xan*_*aki -1 c string null eof

我想在C中编写一个程序来填充数组p [MAX] [N]的字符串

我用过这个,但我不知道当我输入时哪个是空字符串.

#include <stdio.h>
#include <string.h>
#define R 3
#define C 8

int main()
{
    int i;
    char strings[R][C]; 
    printf("***Table of Strings - Names***\n\n");
    for(i=0;(i<R && gets(strings[i]));i++)
    ;           
    if(i==R)
    printf("\n**Table Full - input terminated \n");
    for(i=0;i<R;i++)
        puts(strings[i]);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

jsc*_*410 5

首先,永远不要使用gets().它本质上是危险的,因为它不会对传递给它的内存进行任何边界检查.fgets()改为使用:

for (i = 0; i < R && fgets(strings[i], C, stdin); ++i);
Run Code Online (Sandbox Code Playgroud)

请注意fgets(),假设整行可以放在缓冲区中,将在字符串末尾的输入中留下任何新行('\n').如果整行不能适合你的缓冲区,那么它读取的数量可以放入你的缓冲区(留出空间并且总是附加一个nul终止符),停止读取该点的输入并保留其余的输入流.由于程序C中的这么小,这种情况很可能发生.

或者,您可以使用getline()它在您的平台上可用:

char *strings[R] = { 0 };
size_t cap;

for (i = 0; i < R && 0 <= getline(&strings[i], (cap = 0, &cap), stdin));

if (i == R)
  printf("\n**Table Full - input terminated \n");

for (i = 0; i < R && strings[i]; ++i)
    puts(strings[i]);

/* program done; clean up strings */

for (i = 0; i < R && strings[R]; ++i)
  free(strings[R]);
Run Code Online (Sandbox Code Playgroud)

getline()自动动态(重新)分配适合输入流中下一行所需的内存.它还在字符串末尾的输入中留下任何新行('\n').

其次,ctrl-D通常用于终止来自终端的程序的输入.