26、Makefile/shell/字符串处理相关练习20240208
一、现有文件test.c\test1.c\main.c , 请编写Makefile.
vi Makefile 创建
代码:
CC=gcc
EXE=who
OBJS=$(patsubst %.c,%.o,$(wildcard *.c))
FLAGS=-c -o
all:$(EXE)
$(EXE):$(OBJS)
$(CC) $^ -o $@
%.o:%.c
$(CC) $(FLAGS) $@ $^
.PHONY:clean
clean:
@rm $(OBJS) $(EXE)
运行:
二、C编程实现:输入一个字符串,计算单词的个数
如:“this is a boy” 输出单词个数:4个
代码:
#include<stdlib.h>
#include<string.h>
#include<stdio.h>
int word_number(char *p)
{
int i=0,count=0;
while(*(p+i))//外层循环控制到'\0'结束;
{
int j=i;
while(*(p+j)!=' ' && *(p+j)!='\0')// 跳过单词到空格或\0结束;
j++;
if(*(p+j)==' ')// 记录单词中间空格的个数;
count++;
while(*(p+j)==' ')// 跳过空格
j++;
i=j;// 外层循环步长,即从下一个单词开始下一轮循环
}
return count+1;//单词个数等于中间空格个数加一
}
int main(int argc, const char *argv[])
{
char str[20]="";
printf("please enter the str:");
gets(str);//gets可以获取终端输入含有空格的字符串;
int count=word_number(str);封装函数计算个数
printf("number of words is:%d\n",count);
return 0;
}
运行:
三、在终端输入一个文件名,判断文件类型
代码:
#!/bin/bash
read -p "please enter file:" file
if [ -b $file ]
then
echo dev
elif [ -c $file ]
then
echo char_dev
elif [ -d $file ]
then
echo dir
elif [ -L $file ]
then
echo link
elif [ -S $file ]
then
echo socket
elif [ -p $file ]
then
echo pipe
elif [ -f $file ]
then
echo regular
else
echo error
fi
运行:
四、C编程实现字符串倒置:(注意 是倒置,而不是直接倒置输出)
如:原字符串为:char *str = “I am Chinese”
倒置后为:“Chinese am I”
附加要求:删除原本字符串中 多余的空格。
代码:
#include<stdlib.h>
#include<string.h>
#include<stdio.h>
void Inversion(char *p)
{
int k=strlen(p)-1;//计算字符串长度;
int i=0;
while(i<k)//整体逆置;
{
char t=*(p+i);
*(p+i)=*(p+k);
*(p+k)=t;
i++;k--;
}
i=0;
while(*(p+i))//外层循环控制到'\0'结束;
{
int j=i;
while(*(p+j)!=' '&& *(p+j)!='\0') //找到单词后面的第一个空格或'\0';
j++;
k=j-1;//k为单词最后一个字母;
while(i<k)//单词再逆置;
{
char t=*(p+i);
*(p+i)=*(p+k);
*(p+k)=t;
i++;k--;
}
int z=j+1;//z为空格的后一个字符
while(*(p+z)==' ') //如果z仍未空格 则将后续字符串整体前移
{
int x=z;
while(*(p+x))//整体前移(等价于删除多余空格)
{
*(p+x)=*(p+x+1);
x++;
}
}
i=z;//循环结束时即表示z的位置不为空格,将位置赋值给i;
}
}
int main(int argc, const char *argv[])
{
char str[]="I am Chinese";//定义字符串
Inversion(str);//封装函数逆置单词并删除多余空格
puts(str);//输出逆置后的字符串;
return 0;
}
运行: