一、一個小插曲
在寫這篇文章之前,作者想先和大家分享一個小故事。如果你不想看這個小故事的話,可以直接跳到第二點哦。
為了鍛煉自己的編碼能力,平時作業(yè)和實驗題的代碼我都是不看書、不看老師的PPT,按照自己的思路一行一行敲出來的。同時也不太理解那些照著書敲代碼的同學。直到有一天,我看見我的數據結構作業(yè)字符串大小比較的函數被打上了一把大大的紅叉,我一開始很不理解:我的代碼在編譯器上成功運行了,沒問題呀!一定是老師改錯了。
我當初寫的代碼是這樣的,思路是:先比較串長,字符串越長越大。若串長一致,再依次比較各個字符的ASCII碼,ASCII碼大的串越大。所以寫出來的函數是這樣的。
Status StringCompare1(String* S, String* T)//返回值為1,表示S>T;返回值為0,代表S=T;返回值為-1,代表S<T
{
if (S->len > T->len)//串長S>T
return 1;
else if (S->len < T->len)//串長S<T
return -1;
else//若串長一致,則分別比較相應字符的ASCII
{
for (int i = 0; i < S->len; i++)
{
if (S->data[i] > T->data[i])
return 1;
else if (S->data[i] < T->data[i])
return -1;
}
return 0;//若循環(huán)跳出,則說明兩個字符串完全相同
}
}
又過了好幾個星期(也就是今天),我打算寫一篇字符串大小比較的函數,因為是要發(fā)出來給大家看的,所以我必須保證內容的正確性,于是我在CSDN上搜了幾篇關于字符串大小比較的博客,才發(fā)現我當初是錯得多么離譜。
也是近段時間才明白:不能太忽視書本和教學PPT,要先熟悉掌握經典的算法思路,再去自己敲代碼,否則,完全憑自己的思路,算法往往不是最優(yōu)的,甚至有可能是錯的。像這樣的坑,其實我已經跳了不止一次,今天分享的這個故事只是其中的一個。以后要好好改進這點了,先把基礎打牢,再去“發(fā)明創(chuàng)造”。
二、算法思路及代碼
字符串的大小是從最左邊第一個字符開始比較,大者為大,小者為小,若相等,則繼續(xù)比較后面的字符。
話不多說上代碼:
首先是頭文件、宏定義及結構體等
#include<stdio.h>
#include<stdlib.h>
typedef int Status;
#define ERROR 0
#define OK 1
#define MAX_SIZE 21//多留出一位儲存'\n'
typedef struct String {
char* data;
int len;
};
其次是串的大小比較函數
Status StringCompare(String* S, String* T)//返回值為1,表示S>T;返回值為0,代表S=T;返回值為-1,代表S<T
{
for (int i = 0; S->data[i] && T->data[i]; i++)
{
if (S->data[i] > T->data[i])//分別比較對應字符的ASCII
return 1;
else if(S->data[i] < T->data[i])//分別比較對應字符的ASCII
return -1;
}
return 0;//若循環(huán)跳出,說明兩個字符串大小相等
}
為了測試函數的正確性,我們需要再定義串的初始化函數、輸入函數以及主函數。
串的初始化函數
void InitString(String* s)//初始化
{
s->data = (char*)malloc(sizeof(char)*MAX_SIZE);
s->len = 0;
}
串的輸入函數
Status Input(String* s)//添加元素
{
int n;
printf("輸入需要加入的元素個數:");
scanf("%d", &n);//輸入需要加入的元素個數
getchar();//吸收上一次輸入的'\n'
printf("輸入字符串:");
for (int i = s->len; i <= n; i++)//i<=n因為最后還要輸入'\n'代表輸入完成
{
s->data[i] = getchar();
s->len++;
if (s->len == MAX_SIZE-1)//每一次輸入后,判斷串是否已滿(因為結尾有'\n',所以MAX_SIZE-1就認為數組已滿)
return ERROR;
}
s->len--;//除去結尾的'\n'
return OK;
}
主函數
int main()
{
String* S = (String*)malloc(sizeof(String));
InitString(S);//初始化
Input(S);
String* T = (String*)malloc(sizeof(String));
InitString(T);//初始化
Input(T);
if (StringCompare(S, T) == 1)
printf("S>T");
else if (StringCompare(S, T) == 0)
printf("S=T");
else
printf("S<T");
return 0;
}
所有代碼放一起運行,就能得到最終的運行結果了,這里放一個運行示例,其他的你們自己去試吧。
運行結果
文章來源:http://www.zghlxwxcb.cn/news/detail-770452.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-770452.html
到了這里,關于數據結構(C語言):兩個字符串比較大小的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!