【发布时间】:2017-02-12 18:19:57
【问题描述】:
edit 我将 for 循环更改为一个名为 input 的函数,并在所述函数中初始化 c 的值。还更改了循环内的分支条件,以便在必要时将'\0' 插入到第五个元素。我最初的string1 溢出到string2 的问题仍然存在。我已经摆脱了fflush( stdin ),因为我不确定 Mac OSX El Capitan 是否支持它。
我有一个程序假设连接两个字符串,但我想确保用户不会过度填充数组的大小
现在,如果第一个字符串太长,它会将字符写入下一个字符串,这是不可取的——我的意图是简单地忽略超出数组空间的任何额外字符。
void input( char *s1, int size ){
for( int i = 0, c = 0; ( i < size ) && ( c != '\n' ); i++ ){
c = getchar();
if( i == size - 1 || c == '\n' )
s1[i] = '\0';
else
s1[i] = c;
}
}
int main(){
const int SIZE = 5;
char string1[ SIZE ]; // create a char array
char string2[ SIZE ]; // and another one
printf( "Enter two strings: " );
input( string1, SIZE );
printf("String1: %s\n", string1);
input( string2, SIZE );
printf("String2: %s\n", string2);
}
示例输出...
Enter two strings: foobarr
String1: foob
String2: rr
我怎样才能改变这个,让'arr'被完全忽略,并且
getchar()
在第二个函数调用中等待新的输入?
【问题讨论】:
-
有两个(不相关的)问题:如果您读取的五个字符中没有换行符,您将得到一个未终止的字符串。此外,与您的问题更相关的是,使用
stdin之类的仅输入流调用fflush在技术上是未定义的行为。在循环条件中使用它之前,您可能还需要考虑初始化c。 -
至于你问的问题,只是阅读直到你得到一个换行符怎么样?
-
请注意,只有部分平台支持Using
fflush(stdin)。 -
您不能确保您的字符串以空值结尾。
string1和string2数组最多只能包含 4 个字符以及终止空字节。您还应该使用函数来读取数据,而不是为两个不同的变量重复循环。 -
顺便说一句,您没有检查
getchar返回EOF(只需在 Unix 中尝试 ctrl+d 或在 Windows 中 ctrl+z + 输入,它应该会变得非常疯狂)。
标签: c validation security flush getchar