c/c++ memset用法

memset

Routine

Required header

memset

<memory.h> or <string.h>

wmemset

<wchar.h>


function
<cstring>
void * memset ( void * ptr, int value, size_t num );

Fill block of memory

Sets the first num bytes of the block of memory pointed by ptr to the specified value (interpreted as an unsigned char).

Parameters

ptr
Pointer to the block of memory to fill.
value
Value to be set. The value is passed as an int, but the function fills the block of memory using the unsigned char conversion of this value.
num
Number of bytes to be set to the value.

Return Value

ptr is returned.

Example

1
2
3
4
5
6
7
8
9
10
11
/* memset example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char str[] = "almost every programmer should know memset!";
  memset (str,'-',6);
  puts (str);
  return 0;
}


Output:

------ every programmer should know memset!


注:需要注意的是memset是对第一个参数(指针)所指向的内存中(长度为第三个参数,单位是字节数),每个字节置为字符的ASCII码

也就是说不是以数据类型为单位进行置位的

int a[10];

memset(a,10,sizeof(a));

结果是把a所指向的内存区域每个字节置成了ASCII码10,那么结果自然不是想要的,也就是10 10 10 10(简写的),意思是4个字节中,每个内存都是10,4个自然不是咯!

但是可以给int(float……)或指针行数组初始化成0的;

int a[10];

memset(a,0,sizeof(a));

原理已经讲过了,就不再重复;


要想对int数组,或其他任意数组进行片操作,可以使用STL里的函数模板(fill)

需加头文件

#include <algorithm>


fill

function template
<algorithm>
template < class ForwardIterator, class T >
  void fill ( ForwardIterator first, ForwardIterator last, const T& value );

Fill range with value

Sets value to all elements in the range [first,last).

The behavior of this function template is equivalent to:
1
2
3
4
5
template < class ForwardIterator, class T >
  void fill ( ForwardIterator first, ForwardIterator last, const T& value )
{
  while (first != last)  *first++ = value;
}


Parameters

first, last
Forward iterators to the initial and final positions in a sequence. The range affected is [first,last), which contains all the elements between first and last, including the element pointed by first but not the element pointed by last.
value
Value to be used to fill the range.

Return value

none

Example

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// fill algorithm example
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main () {
  vector<int> myvector (8);                       // myvector: 0 0 0 0 0 0 0 0

  fill (myvector.begin(),myvector.begin()+4,5);   // myvector: 5 5 5 5 0 0 0 0
  fill (myvector.begin()+3,myvector.end()-2,8);   // myvector: 5 5 5 8 8 8 0 0

  cout << "myvector contains:";
  for (vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
    cout << " " << *it;

  cout << endl;
 
  return 0;
}


Output:
myvector contains: 5 5 5 8 8 8 0 0


对数组进行操作就是

int a[10];

std::fill(a,//数组名,也就是首地址

a+10,//首地址+长度,也就是迭代器下一位,这样2个参数就是[a,a[10])<=>a[0]~a[9]

5)//想要置位的值


类似,可以对任何类型的数组操作!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 下面是一个简单的C++使用LocalSocket进行进程间通信的例子: ``` // server.cpp #include <iostream> #include <cstring> #include <unistd.h> #include <sys/socket.h> #include <sys/un.h> int main() { int server_fd, client_fd, len; struct sockaddr_un server_address, client_address; char buffer[256]; // 创建LocalSocket server_fd = socket(AF_UNIX, SOCK_STREAM, 0); if (server_fd < 0) { std::cerr << "Error creating LocalSocket" << std::endl; return 1; } // 绑定地址 memset(&server_address, 0, sizeof(server_address)); server_address.sun_family = AF_UNIX; strncpy(server_address.sun_path, "/tmp/localsocket", sizeof(server_address.sun_path) - 1); unlink(server_address.sun_path); len = sizeof(server_address); if (bind(server_fd, (struct sockaddr*)&server_address, len) < 0) { std::cerr << "Error binding LocalSocket" << std::endl; return 1; } // 监听连接请求 if (listen(server_fd, 5) < 0) { std::cerr << "Error listening LocalSocket" << std::endl; return 1; } std::cout << "Server started, waiting for connections..." << std::endl; while (true) { // 接受连接请求 len = sizeof(client_address); client_fd = accept(server_fd, (struct sockaddr*)&client_address, (socklen_t*)&len); if (client_fd < 0) { std::cerr << "Error accepting connection" << std::endl; return 1; } // 读取客户端发送的数据 memset(buffer, 0, sizeof(buffer)); read(client_fd, buffer, sizeof(buffer) - 1); std::cout << "Received message: " << buffer << std::endl; // 发送响应给客户端 const char* response = "Hello from server!"; write(client_fd, response, strlen(response)); // 关闭连接 close(client_fd); } // 关闭LocalSocket close(server_fd); unlink(server_address.sun_path); return 0; } ``` ``` // client.cpp #include <iostream> #include <cstring> #include <sys/socket.h> #include <sys/un.h> int main() { int server_fd, len; struct sockaddr_un server_address; char buffer[256]; // 创建LocalSocket server_fd = socket(AF_UNIX, SOCK_STREAM, 0); if (server_fd < 0) { std::cerr << "Error creating LocalSocket" << std::endl; return 1; } // 连接到服务器 memset(&server_address, 0, sizeof(server_address)); server_address.sun_family = AF_UNIX; strncpy(server_address.sun_path, "/tmp/localsocket", sizeof(server_address.sun_path) - 1); len = sizeof(server_address); if (connect(server_fd, (struct sockaddr*)&server_address, len) < 0) { std::cerr << "Error connecting to server" << std::endl; return 1; } // 发送数据给服务器 const char* message = "Hello from client!"; write(server_fd, message, strlen(message)); // 读取服务器响应 memset(buffer, 0, sizeof(buffer)); read(server_fd, buffer, sizeof(buffer) - 1); std::cout << "Received response: " << buffer << std::endl; // 关闭LocalSocket close(server_fd); return 0; } ``` 在运行这个例子之前,请确保/tmp/localsocket不存在。在一个终端中编译并运行server.cpp: ``` g++ -o server server.cpp ./server ``` 然后在另一个终端中编译并运行client.cpp: ``` g++ -o client client.cpp ./client ``` 你将会看到服务端输出 "Received message: Hello from client!",客户端输出 "Received response: Hello from server!"。这表明两个进程已经成功地通过LocalSocket进行了通信。 ### 回答2: 一个使用C/C++的LocalSocket的例子是Android应用程序的通信机制。在Android开发中,应用程序可以使用LocalSocket来进行进程间通信(IPC),特别是在同一个设备上不同应用程序之间的通信。 举个例子,我们有一个名为AppA和一个名为AppB的应用程序。AppA想要与AppB进行通信,可以使用LocalSocket来实现。 首先,在AppA中,我们需要创建一个LocalSocket对象并设置其连接类型为AF_LOCAL。然后,我们需要使用LocalSocketAddress来指定AppB的名称或套接字路径。接下来,我们可以使用connect()方法来连接到AppB。一旦连接成功,AppA可以通过LocalSocket的getInputStream()方法获取AppB发送过来的数据,并通过getOutputStream()方法向AppB发送数据。 在AppB中,我们也需要创建一个LocalSocket对象并设置其连接类型为AF_LOCAL。然后,我们需要使用LocalSocketAddress来指定AppB的名称或套接字路径。在AppB中,我们需要创建一个ServerSocket并使用bind()方法将其绑定到指定的LocalSocketAddress。然后,我们可以使用accept()方法等待来自AppA的连接请求。一旦连接成功,AppB可以通过LocalSocket的getInputStream()方法获取AppA发送过来的数据,并通过getOutputStream()方法向AppA发送数据。 总之,通过使用LocalSocket,AppA和AppB可以通过IPC机制进行通信,实现数据的传输和共享。通过基于本地套接字的通信,我们可以方便地在同一个设备上的不同应用程序之间进行数据交换和协同工作。 ### 回答3: C/C++是一种通用的编程语言,可以用来开发各种类型的应用程序,包括网络通信程序。LocalSocket是C/C++中常用的一种网络通信方式,主要用于同一台设备上运行的进程之间进行通信。 下面举一个使用LocalSocket的例子。假设我们有一个需求,需要开发一个应用程序,其中一个进程用于接收用户输入的消息,并将消息传递给另一个进程进行处理。 首先,我们可以创建一个Server进程和一个Client进程。 Server进程通过创建一个LocalSocket,并指定一个唯一的Socket名称来监听来自Client进程的连接请求。它可以通过以下代码实现: ```c++ #include <sys/types.h> #include <sys/socket.h> #include <sys/un.h> int main() { int server_fd, client_fd; socklen_t len; struct sockaddr_un server_addr, client_addr; // 创建LocalSocket server_fd = socket(AF_UNIX, SOCK_STREAM, 0); // 设置Socket地址 server_addr.sun_family = AF_UNIX; strcpy(server_addr.sun_path, "/tmp/local_socket"); // 绑定Socket到地址 bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)); // 开始监听连接请求 listen(server_fd, 5); // 接受Client的连接请求 len = sizeof(client_addr); client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &len); // 处理接收到的消息 // ... // 关闭Socket close(client_fd); close(server_fd); return 0; } ``` Client进程通过创建一个LocalSocket,并指定要连接的Server进程的Socket名称来与Server进程建立连接。它可以通过以下代码实现: ```c++ #include <sys/types.h> #include <sys/socket.h> #include <sys/un.h> int main() { int server_fd; socklen_t len; struct sockaddr_un server_addr; // 创建LocalSocket server_fd = socket(AF_UNIX, SOCK_STREAM, 0); // 设置Socket地址 server_addr.sun_family = AF_UNIX; strcpy(server_addr.sun_path, "/tmp/local_socket"); // 连接到Server进程 connect(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)); // 发送消息到Server进程 // ... // 关闭Socket close(server_fd); return 0; } ``` 通过上述代码,我们可以在Server进程和Client进程之间建立一个LocalSocket连接,并进行消息的收发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值