将空字符串分配给 gets
Assign null string to gets
我想用 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;
}
首先,永远不要使用gets()
。它本质上是危险的,因为它不会对您传递给它的内存进行任何边界检查。使用 fgets()
代替:
for (i = 0; i < R && fgets(strings[i], C, stdin); ++i);
请注意,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]);
getline()
自动动态(重新)分配必要的内存以适应输入流中的下一行。它还会在字符串末尾的输入中留下任何新行 ('\n')。
其次,ctrl-D 通常用于终止从终端到程序的输入。
成功了。我改成了这个
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?
我想用 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;
}
首先,永远不要使用gets()
。它本质上是危险的,因为它不会对您传递给它的内存进行任何边界检查。使用 fgets()
代替:
for (i = 0; i < R && fgets(strings[i], C, stdin); ++i);
请注意,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]);
getline()
自动动态(重新)分配必要的内存以适应输入流中的下一行。它还会在字符串末尾的输入中留下任何新行 ('\n')。
其次,ctrl-D 通常用于终止从终端到程序的输入。
成功了。我改成了这个
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?