Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在循环中使用scanf动态读取C中的字符_C_Scanf - Fatal编程技术网

在循环中使用scanf动态读取C中的字符

在循环中使用scanf动态读取C中的字符,c,scanf,C,Scanf,我是C语言的新手,我正在尝试动态读取字符。我想将它们保存到一个数组中,以便以后使用。我现在得到的是这个,我不明白为什么它不起作用。我的问题是,我必须按enter键两次,它将只保存一个字符 char temp; char tempOld; int i = 0; char string[80]; while(scanf("%c", &temp) == 1 && tempOld != '\n') { string[i] = temp; tempOld = te

我是C语言的新手,我正在尝试动态读取字符。我想将它们保存到一个数组中,以便以后使用。我现在得到的是这个,我不明白为什么它不起作用。我的问题是,我必须按enter键两次,它将只保存一个字符

char temp;
char tempOld;
int i = 0;
char string[80];

while(scanf("%c", &temp) == 1 && tempOld != '\n')
{
    string[i] = temp;
    tempOld = temp;
    i++;
}

string[i] = '\0';
我练习的重点是不要使用
string.h
scanf(“%80s”,string)


谢谢

不要调用scanf来读取键盘输入。此代码建议

while(EOF != (temp = getc(stdin)) && tmpOld != '\n')
另外,将tmpOld初始化为某个值,否则编译器可能很乐意删除整个循环


不管怎样,我发现
scanf()
是一个足够的后遗症,我停止使用它,只使用
sscanf()
,我已经验证过字符串的格式是正确的。

不要调用scanf来读取键盘输入。此代码建议

while(EOF != (temp = getc(stdin)) && tmpOld != '\n')
另外,将tmpOld初始化为某个值,否则编译器可能很乐意删除整个循环


总之,我发现
scanf()
是我停止使用它的背后的一个足够的痛苦,并且只使用我已经验证过的字符串的格式正确。

循环条件
while(scanf(“%c”、&temp)==1&&tempOld!='\n')
首先读取一个字符,然后检查前一个字符是否为换行符。此外,值
tempOld
未初始化,因此第一次循环迭代时的行为实际上未定义

您需要检查当前读取的字符是否是换行符,如果是,则终止循环。比如:

int temp;
while (i < 79 && (temp = getc(stdin)) != EOF && temp != '\n')
{
    string[i++] = temp;
}
string[i] = '\0';
int-temp;
而(i<79&(temp=getc(stdin))!=EOF&&temp!='\n')
{
字符串[i++]=temp;
}
字符串[i]='\0';

您的循环条件
while(scanf(“%c”,&temp)==1&&tempOld!='\n')
首先读取一个字符,然后检查前一个字符是否是换行符。此外,值
tempOld
未初始化,因此第一次循环迭代时的行为实际上未定义

您需要检查当前读取的字符是否是换行符,如果是,则终止循环。比如:

int temp;
while (i < 79 && (temp = getc(stdin)) != EOF && temp != '\n')
{
    string[i++] = temp;
}
string[i] = '\0';
int-temp;
而(i<79&(temp=getc(stdin))!=EOF&&temp!='\n')
{
字符串[i++]=temp;
}
字符串[i]='\0';

“它不工作”不是一个有用的问题描述。是的,我很抱歉。刚刚编辑了我的帖子!因为循环条件
while(scanf(“%c”,&temp)==1&&tempOld!='\n')
首先读取一个字符,然后检查前一个字符是否是换行符。你必须在换行后多读一个字符才能终止循环。我明白了。。。我真的不知道我脑子里想的是什么。现在很好用,谢谢!我将发布代码以最终帮助他人。顺便说一句:使用
charstring[80],代码不应使用scanf(“%80s”,字符串)
。也许
scanf(“%79s”,string)
或者更好的
fgets(string,sizeof string,stdin)
“它不工作”不是一个有用的问题描述。是的,我很抱歉。刚刚编辑了我的帖子!因为循环条件
while(scanf(“%c”,&temp)==1&&tempOld!='\n')
首先读取一个字符,然后检查前一个字符是否是换行符。你必须在换行后多读一个字符才能终止循环。我明白了。。。我真的不知道我脑子里想的是什么。现在很好用,谢谢!我将发布代码以最终帮助他人。顺便说一句:使用
charstring[80],代码不应使用scanf(“%80s”,字符串)
。也许
scanf(“%79s”,string)
或者更好的
fgets(string,sizeof string,stdin)
OP更新了帖子——所以这个答案并没有回答他的问题:我的问题是我必须按enter键twice@MFisherKDX当前位置我认为它仍然适用
scanf
会做一些愚蠢的事情,比如从键盘上读东西,把剩下的部分放下来。OP更新了帖子——所以这个答案并没有回答他的问题:我的问题是我必须按enter键twice@MFisherKDX当前位置我认为它仍然适用
scanf
做一些愚蠢的事情,比如从键盘上读,把剩下的部分都扔了。