我正在使用OSDEV
制作操作系统,并且想制作一个控制台,但是使用scanf
时我无法使用。使用此代码将导致无法输入文本。输出为:
KironOS Console - v0.0.1 PRE-ALPHA
键入help
作为命令列表。
> Some weird characters
> Some weird characters
> Some weird characters
而且还在继续
kernel.c
typedef int bool;
#define true 1
#define false 0
#include <stdio.h>
const char* input();
void execute(const char* cmd);
void output(const char* s, bool ln);
void _puts(const char* s);
void _putchar(char c);
char* newline = "\n\r";
char* version = "0.0.1 PRE-ALPHA";
void main(void) {
output("KironOS Console - v",0); output(version,1);
output("Type 'help' for a list of commands.",1);
output("",1);
while(1==1) {
output("> ",0);
execute(input());
output("",1);
}
}
void execute(const char* cmd) {
output(cmd,1);
}
const char* input() {
// This doesn't work
const char* inpt = "Hi";
scanf("%c",&inpt);
return inpt;
}
void output(const char* s, bool ln) {
_puts(s);
if (ln==1) {
_puts(newline);
}
}
void _puts(const char* s) {
while(*s != 0) {
_putchar(*s);
s++;
}
}
void _putchar(char c) {
__asm {
mov ah, 0Eh
mov al, [c]
mov bh, 0
mov bl, 0Fh
int 10h
}
}
答案 0 :(得分:0)
正如您在评论中指出的那样,您的输入例程无效。有几个问题。
const char* inpt = "Hi";
scanf("%c",&inpt);
这段代码看起来像是要创建一个可以接受字符串的缓冲区-但是,如果这样,该缓冲区只够容纳两个字符串。 (实际上有3个字符,“ H”,“ i”和0。)
快速浏览scanf
的文档会告诉我们,在格式说明符需要与指定的类型匹配之后,您传递的参数。在您的情况下,这是一个字符。因此,您应该传递一个字符的地址,即char*
。但是实际上您正在传递char*
的地址,但我不知道为什么您的编译器没有警告您(甚至会产生错误)。我不会让我犯这样的错误。
这应该可行
char inpt[2] = {0,0};
scanf("%c",inpt);
...假设您只希望一次只能输入一个字符,并且希望将其视为字符串。 但是,从input
函数返回局部变量的地址并不安全。您可以返回单个字符,也可以将缓冲区的地址传递给函数,然后它可以写入缓冲区。
如果您打算输入整个字符串并对其进行操作,则可能需要这样的内容:
char str [80];
scanf ("%79s",str);
答案 1 :(得分:-1)
编辑: 根据评论
在C语言中,您的selected_position = forms.ModelChoiceField(queryset=Vacancy.objects.all(), empty_label='(Nothing)')
函数将是:
putchar
这是假设您使用的是80 * 25文本模式。