为获取分配空字符串

时间:2015-03-14 15:28:41

标签: 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;
}

2 个答案:

答案 0 :(得分:5)

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

for (i = 0; i < R && fgets(strings[i], C, stdin); ++i);

请注意fgets()会在字符串末尾的输入中留下任何新行(&#39; \ n&#39;),假设整行可以放在缓冲区中。如果整行不适合你的缓冲区,那么它读取的数量可以放入你的缓冲区(留出空间并且总是附加一个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]);

getline()

{{1}}自动动态(重新)分配必要的内存以适应输入流中的下一行。它还在字符串末尾的输入中留下任何新行(&#39; \ n&#39;)。

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

答案 1 :(得分:0)

有效。我把它改成了这个

int main()
{
    int i,j,max,thesi,sum=0,countCH=0,mikos=0;
    char strings[R][C]; 

    printf("***Table of Strings - Names***\n\n");
for(i=0;(i<R && fgets(strings[i],C,stdin ));i++)
    ;

if(i==R)
    printf("\n**Table Full - input terminated \n");
for(i=0;i<R;i++)
    fputs(strings[i],stdout);
//Euresh megistou string
max=0;
sum=0;
for(i=0;i<R;i++)
{


        mikos=strlen(strings[i])-1;
        sum+=mikos; 
        if(mikos>max)
        {

            max=mikos;
            thesi=i;
        }
}

printf("\nTo string me to megalitero mikos einai auto pou brisketai sthn %d seira \nkai einai to %s \nme mhkos %d",thesi+1,strings[thesi],max);
printf("\nO pinakas me ta strings periexei %d xaraktires\n",sum);


return 0;   

}
It works just fine only that strlen counts all the chars of the string including null char why is that i dont get it?