扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
目录
在成都网站设计、成都网站制作、外贸网站建设中从网站色彩、结构布局、栏目设置、关键词群组等细微处着手,突出企业的产品/服务/品牌,帮助企业锁定精准用户,提高在线咨询和转化,使成都网站营销成为有效果、有回报的无锡营销推广。创新互联专业成都网站建设10余年了,客户满意度97.8%,欢迎成都创新互联客户联系。一、字符串逆序(基础题)
1.一个经典的错误,标准的零分
2.采用gets函数来修补漏洞
编辑
3.非要使用scanf怎么办?
4.使用指针来实现逆序函数
5.将函数修改为,只要传入两个地址,就能逆序这两个地址之间的字符串。
二、字符串逆序(进阶)
链接:字符逆序__牛客网
来源:牛客网
这道题的要求是让我们实现一个字符串逆序
1.一个经典的错误,标准的零分这道题其实,思路上不难,但是有一个点处很容易犯错,我们看下面这个代码
#include#includevoid reverse(char* str)
{
int left = 0;
int right = strlen(str) - 1;
while (left< right)
{
char tmp = 0;
tmp = *(str + left);
*(str + left) = *(str + right);
*(str + right) = tmp;
left++;
right--;
}
}
int main()
{
char arr[10000] = { 0 };
scanf("%s", arr);
reverse(arr);
printf("%s", arr);
return 0;
}
看似正确,但实际上存在一个问题,我们现在牛客网上跑一下
果然如我们所料,出现意外了,那么问题出在哪里了呢?其实,问题是出在scanf上了,scanf默认读取到空格就结束了,因此这道题其实只读取了一个d,反转之后当然是d了
2.采用gets函数来修补漏洞既然scanf不能用,那么该如何解决呢?,其实我们c语言中还有一个函数叫做gets()函数,他也可以读取一个字符串,他不会读取到空格就结束了
代码如下
#include#includevoid reverse(char* str)
{
int left = 0;
int right = strlen(str) - 1;
while (left< right)
{
char tmp = 0;
tmp = *(str + left);
*(str + left) = *(str + right);
*(str + right) = tmp;
left++;
right--;
}
}
int main()
{
char arr[10000] = { 0 };
gets(arr);
reverse(arr);
printf("%s", arr);
return 0;
}
牛客网运行结果为
3.非要使用scanf怎么办?有些时候,非要使用scanf解决这个问题,那么我们如何实现呢?,其实我们可以将%s修改为%[^\n],意思是,读取到\n才结束读取
代码如下
#include#includevoid reverse(char* str)
{
int left = 0;
int right = strlen(str) - 1;
while (left< right)
{
char tmp = 0;
tmp = *(str + left);
*(str + left) = *(str + right);
*(str + right) = tmp;
left++;
right--;
}
}
int main()
{
char arr[10000] = { 0 };
//gets(arr);
scanf("%[^\n]", arr);
reverse(arr);
printf("%s", arr);
return 0;
}
牛客网运行结果为
4.使用指针来实现逆序函数上面的实现方式,其实本质上仍然属于数组的形式,那么我们能不能改为指针呢?答案是可以的,请看下面的代码
#include#includevoid reverse(char* str)
{
char* left = str;
char* right = str + strlen(str) - 1;
while (left< right)
{
char tmp = 0;
tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
int main()
{
char arr[10000] = { 0 };
//gets(arr);
scanf("%[^\n]", arr);
reverse(arr);
printf("%s", arr);
return 0;
}
牛客网运行结果为
5.将函数修改为,只要传入两个地址,就能逆序这两个地址之间的字符串。经历了上面的思考,我们在想,这个逆序多多少少还是有一点不方便,比如在某一个字符串中,我们不想逆序整个字符串,我们只想要逆序一部分,这时候我们上面的函数适用性就不够了,所以我们最好将其改成只要传入两个地址,就可以逆序这两个地址之间的字符串,这样的话,这个函数就变得很好用了。
代码如下
#include#includevoid reverse(char* left,char* right)
{
while (left< right)
{
char tmp = 0;
tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
int main()
{
char arr[10000] = { 0 };
//gets(arr);
scanf("%[^\n]", arr);
reverse(arr, arr + strlen(arr) - 1);
printf("%s", arr);
return 0;
}
牛客网运行结果为
二、字符串逆序(进阶)有了上面那到题目作为基础,我们可以尝试做一下这道题
链接:倒置字符串_牛客题霸_牛客网
来源:牛客网
这道题我们可以看的出来,是上一道题的进阶版,但是根据我们上一道题的思考之后,这道题其实也没有那么难,因为我们已经创建一个函数,只要传入两个地址,就可以逆序这两个地址之间的字符串。
所以我们的思路就是,先逆序,整个字符串,然后逆序每一个单词
代码如下
#include#includevoid reverse(char* left,char* right)
{
while (left< right)
{
char tmp = 0;
tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
int main()
{
char arr[100] = { 0 };
gets(arr);
//逆序整句话
reverse(arr, arr + strlen(arr) - 1);
//逆序每一个单词
char* p1 = arr;
char* p2 = arr;
while (*p2 != '\0')
{
p1 = p2;
while (*p2 != ' '&&*p2!='\0')
{
p2++;
}
reverse(p1, p2 - 1);
if (*p2 == '\0')
{
break;
}
p2++;
}
printf("%s", arr);
return 0;
}
对于这段代码的逆序每一个单词环节,可能有很多人都有所困惑。为什么是这样实现的呢?
我们逆序单词是采用的双指针的方法。先定义两个字符指针他们指向字符串的首元素地址,然后我们令p1先不动,p2往下走,只要我的p2不是'\0',自然就可以一直走下去,在里面我们先采用一个while循环,来让p2 走到单词的末尾,然后使用逆序函数,逆序这两者之间的单词,然后判断一下p2的里面的值是否为\0,如果此时为\0就不需要进行接下来的步骤了,直接结束即可。
但是如果此时不为'\0',那么就要继续执行下去,先让p2++,让我们的p2指向下一个单词的首元素,将下一个单词的首元素交给p1,然后p2继续走下去,这样循环下去就可以实现目标了。
牛客网运行结果为
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流