如何返回STRING前100个字

本文介绍了一种从数据库读取数据并将其转换为前100个字符的方法,特别关注如何处理全角和半角字符的问题。通过定义一个toGB函数来确保字符串能正确地转化为GB2312编码,从而避免显示错误。

String.substring(0,200)

以及解决其中的全角半角问题

 http://www.jspcn.net/htmlnews/11049388356561897.html 

我是这样解决全角半角问题的
作者:未知     文章来源:www.jspcn.net
访问次数: name="ad" src="../count.jsp?news_id=2646" frameborder="0" width="30" scrolling="no" height="10">次    加入时间:2005-01-19
 
从数据库里面读取到数据,想显示前100个字,考虑用String.substring(0,200);
但是如果这100个字里面
有半角的字(比如1,a等),就麻烦了。

我是这样解决全角半角问题的。
写一个toGB(String str)函数,如果toGB(String str)里面的str不能正常转化成
gb2312的字符串,
那么显示为空白,toGB(String str).length()为0
假如想返回前100个字,
这样就可以考虑用toGB(String.substring(0,200));
然后判断toGB().length()是否是0,如果是0,则substring(0,200-1);

<% //-------整个程序如下---------%>
<%!public static String toGB(String str){

try{
str=new String(str.getBytes("ISO8859_1"),("GB2312"));
return str;
}
catch(Exception e){
return null;
}
}

//-----------------------------------------------------------------

//.......
//和数据库的连接
//.......

String content;

content=rs.getString("content");

int Ccount;
if((Ccount=content.length())>200){
Ccount=200;
}
if(toGB(content.substring(0,Ccount)).length()==0){
content=content.substring(0,Ccount-1);
}else{
content=content.substring(0,Ccount);
}

out.print(toGB(content));
%>

<think>我们通常无法直接获取一个“本机IP地址”,因为一台机器可能有多个网络接口(如以太网、Wi-Fi、虚拟网卡等),每个接口可能有多个IP地址(IPv4、IPv6等)。但是,常见需求是获取用于连接互联网的IP地址,或者获取某个活动接口的IP地址。一种做法是连接一个外部服务器然后获取本地套接的本地地址,这样得到的是用于对外通信的源IP地址。但是,这个方法需要网络连接,并且可能会受到防火墙的影响。另一种做法是枚举本机的网络接口,然后选择非回环、活动且支持IPV4的接口的IP地址。这里我们使用第二种方法,通过枚举网络接口来获取IP地址。注意:一台机器可能有多个符合条件的IP地址,我们通常选择第一个非回环的IPv4地址。但在实际应用中,可能需要更复杂的逻辑(例如根据路由表选择)。我们将使用跨平台的代码。在Windows和Linux/macOS上,我们可以使用getifaddrs函数(Linux/macOS原生支持,Windows需要额外处理)或者使用平台特定的API。但是,为了简化,我们可以使用Boost.Asio库,它提供了跨平台的网络编程接口。然而,问题要求使用C++标准,并且可能不希望依赖第三方库。所以,我们可以使用平台特定的代码:-在Linux和macOS上,使用getifaddrs。-在Windows上,使用GetAdaptersAddresses。但为了代码的简洁和跨平台,这里我们采用条件编译。注意:由于C++标准库没有提供直接获取网络接口信息的功能,所以我们必须使用平台特定的API。我们将分别编写Windows和POSIX(Linux,macOS等)版本的实现。步骤:1.对于POSIX系统(使用getifaddrs):-调用getifaddrs获取接口列表。-遍历每个接口,跳过回环接口(ifr->ifa_flags&IFF_LOOPBACK),并且我们只取IPv4地址(family==AF_INET)。-复制第一个符合条件的IP地址。2.对于Windows系统(使用GetAdaptersAddresses):-调用GetAdaptersAddresses获取适配器信息。-遍历适配器列表,跳过回环接口(IfType==IF_TYPE_SOFTWARE_LOOPBACK),并且跳过未启用的接口(OperStatus!=IfOperStatusUp)。-对于每个适配器,遍历其Unicast地址列表,选择IPv4地址(family==AF_INET)。-复制第一个符合条件的IPv4地址。由于一台机器可能有多个非回环的IPv4地址,我们选择第一个找到的。更准确的做法可能是根据路由表选择一个用于外网通信的地址,但这里为了简单就取第一个活动的非回环IPv4地址。但是,请注意:可能没有找到任何IP地址,那么返回一个空符串,或者回环地址(127.0.0.1)作为备选?这里我们返回符串,表示没有找到。由于代码较长,我们将其封装到一个函数中。以下为具体代码(包含必要的头文件):</think> 以下是一个用于获取本机IP地址的C++函数实现。这个解决方案可以跨平台工作(Windows和Linux/macOS),我将提供详细解释和相关问题: ```cpp #include <iostream> #include <string> #include <cstring> #ifdef _WIN32 #include <winsock2.h> #include <ws2tcpip.h> #include <iphlpapi.h> #pragma comment(lib, "iphlpapi.lib") #pragma comment(lib, "ws2_32.lib") #else #include <sys/types.h> #include <ifaddrs.h> #include <netinet/in.h> #include <arpa/inet.h> #endif std::string getLocalIP() { #ifdef _WIN32 PIP_ADAPTER_ADDRESSES pAddresses = nullptr; ULONG outBufLen = 0; DWORD dwRetVal = 0; char ipstr[INET_ADDRSTRLEN] = ""; // 获取所需缓冲区大小 GetAdaptersAddresses(AF_UNSPEC, 0, nullptr, nullptr, &outBufLen); pAddresses = (PIP_ADAPTER_ADDRESSES)malloc(outBufLen); dwRetVal = GetAdaptersAddresses(AF_INET, GAA_FLAG_INCLUDE_PREFIX, nullptr, pAddresses, &outBufLen); if (dwRetVal != NO_ERROR) { free(pAddresses); return ""; } // 遍历适配器 PIP_ADAPTER_ADDRESSES pCurr = pAddresses; while (pCurr) { if (pCurr->OperStatus == IfOperStatusUp && pCurr->IfType != IF_TYPE_SOFTWARE_LOOPBACK) { PIP_ADAPTER_UNICAST_ADDRESS pUnicast = pCurr->FirstUnicastAddress; while (pUnicast) { if (pUnicast->Address.lpSockaddr->sa_family == AF_INET) { sockaddr_in *ipv4 = (sockaddr_in *)pUnicast->Address.lpSockaddr; inet_ntop(AF_INET, &(ipv4->sin_addr), ipstr, INET_ADDRSTRLEN); if (strcmp(ipstr, "0.0.0.0") != 0) { free(pAddresses); return std::string(ipstr); } } pUnicast = pUnicast->Next; } } pCurr = pCurr->Next; } free(pAddresses); return ""; #else struct ifaddrs *ifap, *ifa; char ipstr[INET_ADDRSTRLEN] = ""; if (getifaddrs(&ifap) == -1) { return ""; } // 遍历网卡接口 for (ifa = ifap; ifa != nullptr; ifa = ifa->ifa_next) { if (ifa->ifa_addr == nullptr) continue; // 只处理IPv4地址 if (ifa->ifa_addr->sa_family == AF_INET && (strcmp(ifa->ifa_name, "lo") != 0)) { // 排除回环接口 struct sockaddr_in *sa = (struct sockaddr_in *)ifa->ifa_addr; inet_ntop(AF_INET, &sa->sin_addr, ipstr, INET_ADDRSTRLEN); if (strcmp(ipstr, "0.0.0.0") != 0) { freeifaddrs(ifap); return std::string(ipstr); } } } freeifaddrs(ifap); return ""; #endif } int main() { std::string localIP = getLocalIP(); if (!localIP.empty()) { std::cout << "本机IP地址: " << localIP << std::endl; } else { std::cout << "无法获取IP地址" << std::endl; } return 0; } ``` ### 代码解释: #### 1. 跨平台处理 - **Windows部分**:使用`GetAdaptersAddresses`API获取网络适配器信息 - `PIP_ADAPTER_ADDRESSES`存储网络适配器信息 - 遍历适配器,跳过虚拟适配器和回环接口 - 获取活动的IPv4地址 - **Linux/macOS部分**:使用`getifaddrs`函数 - 遍历系统所有网络接口 - 过滤出IPv4地址并排除回环接口(lo) - 使用`inet_ntop`转换二进制地址为符串 #### 2. 关键函数 - `inet_ntop()`:将二进制IP地址转换为点分十进制符串 - `GetAdaptersAddresses()`(Windows):获取网络适配器详细信息的核心API - `getifaddrs()`(Linux/macOS):获取系统所有网络接口信息 #### 3. 过滤逻辑 - 排除回环地址(127.0.0.1/::1) - 排除无效地址(0.0.0.0) - 优先返回第一个有效的物理网络接口地址 #### 4. 返回值 - 返回符串形式的IP地址(如"192.168.1.100") - 无网络连接时返回符串 #### 5. 注意事项 - Windows需要链接`iphlpapi.lib`和`ws2_32.lib` - Linux/macOS需要包含标准socket头文件 - 程序可能需要管理员权限才能获取所有网络信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值