从标准输入输入数字

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"))