如何在C中的一个输入中获得多个字符

时间:2019-03-16 21:22:26

标签: c stdio

我是C编程的新手,所以我试图编写一段代码,在其中我需要使用十六进制的IP地址,但我不知道该怎么做。据我所知,例如,当用户输入“ A”时,我无法使用 char 进行多次输入,而使用 int 进行了多次输入。 对于十进制输入,我写了这样的内容

from window1 import *
from window2 import *

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow3(object):
def setupUi3(self, MainWindow):
    MainWindow.setObjectName("MainWindow")
    MainWindow.resize(397, 319)
    self.centralwidget = QtWidgets.QWidget(MainWindow)
    self.centralwidget.setObjectName("centralwidget")
    self.label = QtWidgets.QLabel(self.centralwidget)
    self.label.setGeometry(QtCore.QRect(180, 110, 47, 13))
    self.label.setObjectName("label")
    self.pushButton = QtWidgets.QPushButton(self.centralwidget)
    self.pushButton.setGeometry(QtCore.QRect(290, 250, 75, 23))
    self.pushButton.setObjectName("pushButton")
    MainWindow.setCentralWidget(self.centralwidget)
    self.statusbar = QtWidgets.QStatusBar(MainWindow)
    self.statusbar.setObjectName("statusbar")
    MainWindow.setStatusBar(self.statusbar)

    self.retranslateUi(MainWindow)
    QtCore.QMetaObject.connectSlotsByName(MainWindow)

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow3()
    ui.setupUi3(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

我使用了4个变量,因为以后我将使用这些数字进行转换。

编辑:很抱歉没有添加此内容,我无法使用十六进制%x或数组/字符串

3 个答案:

答案 0 :(得分:0)

出什么问题了?

输入字母时的巨大价值是因为scanf()无法将字母识别为int的有效输入,并停止读取,而其余变量未分配。

如何解决?

首先,您应该检查是否已阅读所需的变量:

if (scanf("%d.%d.%d.%d",&IP_1,&IP_2,&IP_3,&IP_4)<4) {
    printf ("Error:  invalid format !\n"); 
}

然后,您可能想读取十六进制格式的整数:

scanf("%x.%x.%x.%x",&IP_1,&IP_2,&IP_3,&IP_4);

您将找到有关scanf() here的输入格式的更多信息

重要说明:IPv4地址的约定是使用点分隔小数部分。对于十六进制表示法,这些数字原则上是连续的,每个部分为2个数字。

编辑

如果不允许使用%x,数组和字符串,则只能输入十六进制数字作为char。假设每个十六进制部分都用2位数字输入,那么您可能必须输入8个字符:

char c1, c2, c3, c4, c5, c6, c7, c8; 
scanf("%c%c.%c%c.%c%c.%c%c",&c1, &c2, &c3, &c4, &c5, &c6, &c7,&c8);
// are you sure you have to enter the dots ?  

要将两个十六进制字符转换为一个int而不使用字符串和数组,您可以执行以下操作:

if (c1>='A' && c1<='F') 
    IP_1 = c1-'A'; 
else if (c1>='0' && c1<='9') 
    IP_1 = c1-'0';
else 
    IP_1 = 0;   // OUCH! THIS IS AN ERROR

IP_1 = IP_1 *16; 
if (c2>='A' && c2<='F') 
    IP_1 = IP_1 + c2-'A'; 
else if (c2>='0' && c2<='9') 
    IP_1 = IP_1 + c2-'0';
else 
    IP_1 = 0;   // OUCH! THIS IS AGAIN AN ERROR

作为练习,我添加数字小写的情况。我不允许您创建所有字符,因为不允许您创建函数。

最后的话

在我看来,强迫学生大屠杀全球公认的IP地址约定的习俗然后强迫学生复制粘贴代码显然是完全无能的老师的迹象。

为了您的利益,您不应该像我在这里那样透明和开放。但是,我有义务警告您:在网络上获得一些不错的教程。或购买K&R并执行其中包含的所有练习。您将学习真正的技能,而不是养成不良习惯。

答案 1 :(得分:0)

我认为最好的方法是读取字符串,然后使用将字符串转换为IP的功能(即inet_aton())。 另外,我会避免为字符串使用scanf,这是不安全的。

有关实时演示和代码,请参见https://ideone.com/aO9Nll

答案 2 :(得分:0)

#include <stdio.h>

int main() {

unsigned int IP_1,IP_2,IP_3,IP_4; 

printf("Enter the IP address:\n");
scanf("%x %x %x %x",&IP_1,&IP_2,&IP_3,&IP_4); //storing in Hex format

printf("%x %x %x %x",IP_1,IP_2,IP_3,IP_4); 

}