我有这个功能,检查字符串是否为:
void get_string(char *prompt, char *input, int length)
{
printf("%s", prompt);
fgets(input, length, stdin);
if (input[strlen(input) - 1] != '\n')
{
int dropped = 0;
while (fgetc(stdin) != '\n')
{
dropped++;
}
if (dropped > 0)
{
printf("Errore: Inserisci correttamente la stringa.\n");
get_string(prompt, input, length);
}
}else{
input[strlen(input) - 1] = '\0';
}
return;
}
使用此功能,只有当字符串长于length
时,我才能重复输入。
如果我还必须检查字符串是否更短,我该怎么办?
答案 0 :(得分:3)
如果字符串较短,button. addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
function mouseDownHandler(event:MouseEvent):void {
navigateToURL(new
URLRequest("https://website.com/"));
}
button2. addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
function mouseDownHandler2(event:MouseEvent):void {
navigateToURL(new
URLRequest("https://anotherwebsite.com/"));
}
button3. addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
function mouseDownHandler3(event:MouseEvent):void {
navigateToURL(new
URLRequest("https://yetanotherwebsite.com/"));
}
负责处理。缓冲区不会被填满,换行符将被放置在字符串的末尾。
只需在fgets
之后检查strlen(input) < length
。如果该条件的计算结果为true,则读取的值小于缓冲区大小可能产生的最大字节数。
答案 1 :(得分:0)
OP的代码受黑客攻击,可能会导致未定义的行为。
// What happens if the first character read is a null character?
fgets(input, length, stdin);
if (input[strlen(input) - 1] != '\n')
当fgets()
读取输入时,输入 空字符并不特殊。它像任何其他角色一样被阅读和保存。
如果出现这种病态,input[0] == 0
和strlen(input) - 1
为SIZE_MAX
。 input[SIZE_MAX]
肯定是数组边界外的访问,因此未定义的行为。
如果fgets()
未读取所有行,则测试是将最后一个缓冲区字符设置为非零,然后测试它是否为0。
assert(input && length > 1);
input[length - 1] = '\n';
// check `fgets()` return value
if (fgets(input, length, stdin) == NULL) {
return NULL;
}
if (input[length - 1] == '\0' && input[length - 2] != '\n') {
// more data to read.