12222

本文介绍了一种使用C语言实现的字典树(Trie)数据结构。该实现支持字符串插入和查找操作,并通过实例展示了如何统计最大连续单词数。字典树是一种用于处理字符串集合的高效数据结构,在搜索引擎、拼写检查等应用中发挥着重要作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define YES 1
#define NO 0
#define NUM 26
struct trie
{
   trie * next[NUM];
   int isword;
};
trie head,*t,*s;
int Max;
char str1[100];
int exist(trie &head,char x[])
{
   s=&head;
   for(;*x;*x++)
       if(s->next[*x-'a']==NULL)
	return NO;                           
       else s=s->next[*x-'a'];
   return YES;
}
trie* Create() 
{
    trie* p = (trie*)malloc(sizeof (trie));
    for (int i = 0; i < NUM; i++)
        p->next[i] = NULL;
    p->isword = NO;
    return p;
}
int insert(trie &head,char x[])
{
   int cnt = 0;
   s=&head;
   char *p=x;
   for(;*x;*x++)
   {
       if(s->next[*x-'a']==NULL) 			 
		   s->next[*x-'a'] = Create();
        s=s->next[*x-'a'];
		if(s->isword)
		{
			cnt++;
			Max = Max<cnt?cnt:Max;
			strcpy(str1, p);
		}
   }
   if(!s->isword)
   {
		s->isword=YES;
		cnt++;
		Max = Max<cnt?cnt:Max;
		strcpy(str1, p);
   }
   return NO;
}
void deltrie(trie *current)
{
	int i;
	for(i=1;i<NUM;i++)
	{
		if(current->next[i]==NULL) continue;
		deltrie(current->next[i]);
	}
	free(current);
	current=NULL;
}
void inittrie(trie &head)
{
	int i;
	for(i=0;i<NUM;i++)
		head.next[i]=NULL;
	head.isword=NO;
}

int main()
{
	trie head;
	char str[100];
	Max = 0;
	while(scanf("%s", str)==1)
	{
		insert(head, str);
		printf("%d %s\n", Max, str1);
	}
	return 0;
}

<think>我们编写一个Shell脚本,通过SSH连接远程服务器,使用指定的私钥,并获取特定文件的大小,然后将该大小赋值给一个变量。 步骤: 1. 使用ssh命令,指定端口(-p)和私钥文件(-i),并执行远程命令。 2. 远程命令:使用`stat`命令获取文件大小(不同系统可能stat参数不同,这里我们使用通用的方式,比如`stat -c %s`用于Linux,而BSD系统(如macOS)使用`stat -f %z`)。但考虑到目标服务器是Linux,我们使用`stat -c %s`。 3. 注意:如果文件不存在,我们需要处理错误情况。 4. 将远程命令执行的结果赋值给本地变量。 但是,由于我们是通过SSH执行命令,所以需要捕获SSH的输出。同时,我们需要考虑SSH连接过程中可能出现的错误。 脚本如下: ```bash #!/bin/bash # 定义连接参数 SERVER_IP="192.168.4.32" PORT="12222" PRIVATE_KEY="/home/rdsa_8820" REMOTE_FILE="/home/jin/a.gz" # 使用ssh命令获取文件大小 # 注意:这里使用-o StrictHostKeyChecking=no避免首次连接时的确认提示 server_size=$(ssh -p $PORT -i "$PRIVATE_KEY" root@$SERVER_IP "stat -c %s \"$REMOTE_FILE\"" 2>/dev/null) # 检查命令执行是否成功 if [ $? -eq 0 ]; then echo "文件大小为: $server_size 字节" else echo "获取文件大小失败,请检查文件是否存在或连接是否正常" exit 1 fi # 现在变量server_size中存储了文件大小(以字节为单位) ``` 注意: 1. 我们假设使用root用户登录,如果不是,请替换为对应的用户。 2. 我们使用了`2>/dev/null`来忽略错误输出(比如文件不存在时,stat会输出错误信息,但这里我们只关心成功的情况,并通过退出状态码判断)。 3. 如果文件不存在,stat命令会返回非0的退出状态,然后我们脚本中判断$?(上一条命令的退出状态)不为0就报错。 但是,如果连接失败(比如网络问题、密钥错误等),ssh命令也会返回非0,同样会进入错误分支。 改进:我们可以将错误输出重定向到一个临时文件,以便在出错时显示更多信息。但根据要求,我们只需要将文件大小赋值给变量,所以这里简化处理。 另外,如果文件路径中包含空格,我们使用了双引号来确保路径被正确传递。 如果远程服务器使用的是BSD系统(如macOS),则stat命令的参数不同,应使用`stat -f %z`。但根据问题中给出的路径(/home/jin/a.gz)和IP地址(192.168.4.32)来看,这很可能是Linux服务器,所以我们使用`stat -c %s`。 如果目标服务器没有stat命令(虽然可能性很小),可以考虑使用`wc -c`,但注意这需要读取整个文件,对于大文件可能较慢。例如: server_size=$(ssh -p $PORT -i "$PRIVATE_KEY" root@$SERVER_IP "wc -c < \"$REMOTE_FILE\"") 但是,使用`wc -c`会读取整个文件,而`stat`只是读取元数据,效率更高。 因此,我们优先使用`stat`。 如果确定是Linux,那么使用`stat -c %s`没有问题。 最后,将脚本保存为文件(如get_file_size.sh),并赋予执行权限(chmod +x get_file_size.sh),然后运行。 相关问题: 1. 如何通过SSH在远程服务器上执行多条命令? 2. 如何提高SSH连接的安全性? 3. 如何在不输入密码的情况下使用SSH私钥连接? 4. 如果远程服务器上的文件不存在,脚本如何处理? 5. 如何获取远程服务器上文件的修改时间?</think>以下是一个完整的 Shell 脚本解决方案,通过 SSH 使用指定私钥连接远程服务器,获取文件大小并赋值给变量: ```bash #!/bin/bash # 配置参数 SERVER_IP="192.168.4.32" SSH_PORT="12222" PRIVATE_KEY="/home/rdsa_8820" REMOTE_FILE="/home/jin/a.gz" # 通过SSH获取文件大小并赋值给变量 server_size=$(ssh -p $SSH_PORT -i "$PRIVATE_KEY" root@$SERVER_IP "stat -c %s \"$REMOTE_FILE\"" 2>/dev/null) # 检查命令是否执行成功 if [ $? -eq 0 ]; then echo "文件大小获取成功: $server_size 字节" # 在此处可以使用 $server_size 变量进行后续操作 else echo "错误: 无法获取文件大小" exit 1 fi ``` ### 脚本说明: 1. **SSH 连接参数**: - `-p 12222`:指定 SSH 端口 - `-i /home/rdsa_8820`:指定私钥文件 - `root@192.168.4.32`:连接目标服务器(根据实际情况修改用户名) 2. **远程命令**: - `stat -c %s "文件路径"`:获取文件字节大小 - `2>/dev/null`:隐藏错误输出(文件不存在等情况) 3. **结果处理**: - 成功时:文件大小存入 `server_size` 变量 - 失败时:输出错误信息并退出 ### 使用说明: 1. 将脚本保存为 `get_file_size.sh` 2. 添加执行权限: ```bash chmod +x get_file_size.sh ``` 3. 执行脚本: ```bash ./get_file_size.sh ``` ### 注意事项: 1. 确保私钥文件权限正确(建议 600): ```bash chmod 600 /home/rdsa_8820 ``` 2. 如果服务器用户名不是 root,请修改连接字符串 3. 首次连接需手动确认主机密钥(或添加 `-o StrictHostKeyChecking=no` 参数) ### 相关问题: 1. 如何通过 SSH 在远程服务器执行多条命令? 2. 如何提高 SSH 连接的安全性(如使用密钥加密)? 3. 当文件不存在时如何获取详细的错误信息? 4. 如何通过脚本检查远程服务器磁盘空间? 5. 如何用 Python 替代 Shell 实现相同功能?[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值