我的程序有点问题我试图编码..基本上我想在循环中逐个输入符号,当我完成时我只想按顺序输入退出循环,然后将字符串打印到控制台。然而,这似乎并不起作用,而且我已经尝试了几个小时而没有掌握它。这是我的代码
#include <stdio.h>
int main(int argc, char *argv[]){
int i = 0;
char text[i];
char symbol;
while(1){
scanf("%s", &symbol);
if(symbol == 13){ //13 should be the ascii value for enter
break;
}
text[i] = symbol;
i++;
}
printf("%s", text);
getch();
return 0;
}
答案 0 :(得分:2)
%s
读一个字。如果您想阅读scanf
的字符,请使用%c
。 char text[i]
- i
为零。你不能在这里存储你的字符串。要么在编译时知道最大大小(并在附加时检查运行时),要么根据需要动态分配内存。注意:从流中进行裸扫描只是要求很多麻烦。喜欢读行。
答案 1 :(得分:1)
您可以使用termcaps将终端设置为原始模式:
term.c_lflag &= ~(ICANON);
term.c_lflag &= ~(ECHO);
term.c_cc[VMIN] = 1;
term.c_cc[VTIME] = 0;
if (tcsetattr(0, TCSADRAIN, &term) == -1)
return (-1);
然后使用函数:
int main(int ac, char **av, char **env)
{
char *name_term;
struct termios term;
if ((name_term = getenv("TERM")) == NULL)
return (-1);
if (tgetent(NULL, &name_term) == ERR)
return (-1);
if (tcgetattr(0, term) == -1)
return (-1);
grab_key();
return (0);
}
int grab_key()
{
char buffer[3];
while (1)
{
read(0, buffer, 3);
if (buffer[0] == 13)
printf("Exit !");
}
return (0);
}
并将您的终端设置为&#34;正常&#34;模式:
struct termios term;
if (tcgetattr(0, &term) == -1)
return (-1);
term.c_lflag = (ICANON | ECHO);
if (tcsetattr(0, 0, &term) == -1)
return (-1);
答案 2 :(得分:0)
三个问题。首先是你如何阅读角色:
scanf("%s", &symbol);
%s
格式说明符用于读取字符串。你不是传入一个字符串,而是传递一个字符的地址。这将导致scanf
读取多个字符,从symbol
的地址开始,并继续进入可能跟随的任何字节。这是未定义的行为。
要读取单个字符,请改用%c
格式说明符:
scanf("%c", &symbol);
第二期:
if(symbol == 13){
所有系统上的换行符不一定是ASCII 13。请改用换行符转义码:
if(symbol == '\n'){
第三个问题:
int i = 0;
char text[i];
这会创建一个0大小的数组。为了简单起见,给这个数组一些已知的固定大小:
char text[100];
然后你的循环需要检查你输入的字符是否太多。
答案 3 :(得分:0)
在Windows上,当您点击 Enter 时,它会被视为\r\n
,而不仅仅是\r
。所以你可能想试试这个:
while(1){
scanf("%c", &symbol); //use %c to read a character
if(symbol == '\r'){
scanf("%c", &symbol);
if(symbol == '\n') break;
}
text[i] = symbol;
i++;
}
此外,您正在创建一个零数组,然后尝试在其中放置数据。这不行。你最好先分配一些内存然后再读入它:
char text[1024];
int i =0; // then increase i up to 1023
更重要的是,如果您的唯一目的是获取Enter
点击,则根本不需要text
,只需symbol
即可满足您的需求。
答案 4 :(得分:0)
您可能会使用fgetc(3)但它可能无法工作(因为 stdin 在C标准库中缓存 - 请setvbuf(3),在内核中使用ttys,请阅读更多内容关于ttys)。因此,只有当用户按下 return 键时,整行才会发送到您的程序。
在实践中,它是特定的操作系统;我希望你在Linux或其他POSIX系统上。我强烈建议您使用ncurses或readline;另见termios(3)
答案 5 :(得分:0)
首先,数组不会神奇地增加它的大小只是因为你增加了用来设置它的大小的变量(代码中i
中的text[i]
),你应该动态分配内存({ {1}},malloc
或realloc
),并记得释放它。
你的代码应该是这样的:
calloc