c语言字符串截取排序问题

来源:百度知道 编辑:UC知道 时间:2024/05/27 04:35:17
#include <string.h>
#include <stdio.h>

int main()
{
char string[50];
char array[3][10];
char sub[3][10];
char bufinfo[10];
int i, j, max;
strcpy(array[0], "This is 1");
strcpy(array[1], "This is 33");
strcpy(array[2], "This is a 2");
char *ptr[3], c = ' ';
/*strcpy(string, "This is a s tring");*/
ptr[0] = strrchr(array[0], c);
ptr[1] = strrchr(array[1], c);
ptr[2] = strrchr(array[2], c);
for(i=0; i<3; i++)
{
strcpy(sub[i], ptr[i]+1);
printf("%d = %s\n", i, sub[i]);
}

for(i=0; i<3; i++)
{
max = i;
for(j=i+1; j<3; j++)
{
if(atoi(sub[j]) > atoi(sub[max]))
max = j;
}
if(max != i)
{
strcpy(bufinfo, array[i]);
strcpy(array[i], array[max]);
st

2维数组在内存中仍是连续的存储单元
你出现那样的原因是因为 长度超出数组2维长度
越界从而将前面的数据覆盖而导致
画了个示意图如下
------
1 "this is 1" 串首地址
------
2
------
......
------
10
------
11 \0而这里是存放This is 33 首字符的区域,但却被\0占据(第一个串).存第二个串的时候\0被覆盖
------
2
------
3
------
......
------
10
------
11 \0 而这里是存放This is a 2 首字符的区域 却被\0占据 存 第3个串的时候\0又被覆盖
------
2
------
......
------
\0 所以这里才是真正的结束位置,但这里也越界了 。
------
所以你测试输出 array[0]array[1]array[2]结果分别是如下,就是因为\0的原因
This is 1This is 33 This is a 2
This is 33 This is a 2
This is a 2
所以在调用 strrchr“ 查找串中最后一个' '的 位置”
这个串其实是 This is 1This is 33 This is a 2\0
所以输出的是3个2而不是你期望的结果 1 33 2
只要改变下数组合的范围为串的长度就可以了。

char array[3][11]; 改变二维长度 或者缩小串长度

第四行:
char array[3][10];
改为