从标准输入输入数字
Input numbers from Stdin
我试图在 C 中使用标准输入创建一个 AVLtree,我尝试输入的格式是:(7,19) (5,16) (9,13)。我使用的代码是
char str[1024];
int key,value;
while (fgets(str,256,stdin)!=NULL)//stop read files when reached end of the line
{
if(*str == "\n")
{
break;
}
if(sscanf(str,"(%d, %d)",&key, &value) == 2)// if the function can address both number
{
//InsertNode(AVLtree,key,value);
printf("%d, %d\n", key,value);
}
else
{
printf("cannot get correct key & Value");
exit(1)
}
基本上,我是说使用“fgets”函数以 (%d, %d)
格式从标准输入读取输入。一旦到达行尾,就停止。但是通过使用这段代码,它只允许我每行输入一个节点,而不是输入所有节点并以回车结束。有什么办法可以解决这个问题吗?
因为您不知道用户将输入多少个值对,所以您必须使用循环。
成功 sscanf
后,您可以搜索右括号 ')'
并从其后的位置开始下一个 sscanf
。
为了避免在数据之间或之后出现额外的 space 时出现错误消息,我添加了代码以跳过 whitespace 并将格式字符串更改为更加灵活。
我使用一个函数来跳过 space 和检查字符串结尾,因为我在两个地方需要它。
编辑:
如类似问题 How to use sscanf in loops? 的答案所示,您可以使用 %n
格式说明符直接从 sscanf
获取下一个位置的偏移量,因此 strchr
不是必需的.我不会在这里更改这个答案。请参阅其他问题并相应地调整代码。
(还有更多方法可以解决这个问题。)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
/* skip whitespace and check for end of string */
int skip_space(char **pos)
{
while(isspace(**pos))
{
(*pos)++;
}
return (**pos == '[=10=]');
}
int main()
{
char str[1024];
char *pos;
int key,value;
printf("enter key-value pairs of integer numbers like (a,b)(c,d): ");
while (fgets(str,sizeof(str),stdin)!=NULL)//stop read files when reached end of the line
{
pos = str;
if(skip_space(&pos))
{
break;
}
do
{
/* added spaces to format string for more flexibility */
if(sscanf(pos," (%d , %d )",&key, &value) == 2)// if the function can address both number
{
//InsertNode(AVLtree,key,value);
printf("%d, %d\n", key,value);
}
else
{
printf("cannot get correct key & Value at position %d: %s\n", (int)(pos - str), pos);
exit(1);
}
/* since scanf was successful we must have a ')' in the input, so NULL should not occur */
pos = strchr(pos, ')');
/* skip ')' */
pos++;
} while(skip_space(&pos) == 0);
}
return 0;
}
结果:
enter key-value pairs of integer numbers like (a,b)(c,d): (1,2) ( 3 , 4 ) (5,6)(7.0,8)
1, 2
3, 4
5, 6
cannot get correct key & Value at position 21: (7.0,8)
enter key-value pairs of integer numbers like (a,b)(c,d): (1,2) ( 3 , 4 ) (5,6)
1, 2
3, 4
5, 6
(7,8)
7, 8
无关错误:if(*str == "\n")
错误。
如果要检查字符串开头的换行符,请使用
if(*str == '\n')
如果要检查整个字符串是否等于由单个换行符组成的字符串,请使用
if(strcmp(str, "\n") == 0)
或简化
if(!strcmp(str, "\n"))
我试图在 C 中使用标准输入创建一个 AVLtree,我尝试输入的格式是:(7,19) (5,16) (9,13)。我使用的代码是
char str[1024];
int key,value;
while (fgets(str,256,stdin)!=NULL)//stop read files when reached end of the line
{
if(*str == "\n")
{
break;
}
if(sscanf(str,"(%d, %d)",&key, &value) == 2)// if the function can address both number
{
//InsertNode(AVLtree,key,value);
printf("%d, %d\n", key,value);
}
else
{
printf("cannot get correct key & Value");
exit(1)
}
基本上,我是说使用“fgets”函数以 (%d, %d)
格式从标准输入读取输入。一旦到达行尾,就停止。但是通过使用这段代码,它只允许我每行输入一个节点,而不是输入所有节点并以回车结束。有什么办法可以解决这个问题吗?
因为您不知道用户将输入多少个值对,所以您必须使用循环。
成功 sscanf
后,您可以搜索右括号 ')'
并从其后的位置开始下一个 sscanf
。
为了避免在数据之间或之后出现额外的 space 时出现错误消息,我添加了代码以跳过 whitespace 并将格式字符串更改为更加灵活。
我使用一个函数来跳过 space 和检查字符串结尾,因为我在两个地方需要它。
编辑:
如类似问题 How to use sscanf in loops? 的答案所示,您可以使用 %n
格式说明符直接从 sscanf
获取下一个位置的偏移量,因此 strchr
不是必需的.我不会在这里更改这个答案。请参阅其他问题并相应地调整代码。
(还有更多方法可以解决这个问题。)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
/* skip whitespace and check for end of string */
int skip_space(char **pos)
{
while(isspace(**pos))
{
(*pos)++;
}
return (**pos == '[=10=]');
}
int main()
{
char str[1024];
char *pos;
int key,value;
printf("enter key-value pairs of integer numbers like (a,b)(c,d): ");
while (fgets(str,sizeof(str),stdin)!=NULL)//stop read files when reached end of the line
{
pos = str;
if(skip_space(&pos))
{
break;
}
do
{
/* added spaces to format string for more flexibility */
if(sscanf(pos," (%d , %d )",&key, &value) == 2)// if the function can address both number
{
//InsertNode(AVLtree,key,value);
printf("%d, %d\n", key,value);
}
else
{
printf("cannot get correct key & Value at position %d: %s\n", (int)(pos - str), pos);
exit(1);
}
/* since scanf was successful we must have a ')' in the input, so NULL should not occur */
pos = strchr(pos, ')');
/* skip ')' */
pos++;
} while(skip_space(&pos) == 0);
}
return 0;
}
结果:
enter key-value pairs of integer numbers like (a,b)(c,d): (1,2) ( 3 , 4 ) (5,6)(7.0,8)
1, 2
3, 4
5, 6
cannot get correct key & Value at position 21: (7.0,8)
enter key-value pairs of integer numbers like (a,b)(c,d): (1,2) ( 3 , 4 ) (5,6)
1, 2
3, 4
5, 6
(7,8)
7, 8
无关错误:if(*str == "\n")
错误。
如果要检查字符串开头的换行符,请使用
if(*str == '\n')
如果要检查整个字符串是否等于由单个换行符组成的字符串,请使用
if(strcmp(str, "\n") == 0)
或简化
if(!strcmp(str, "\n"))