Skip to content

字符串

约 822 个字 114 行代码 预计阅读时间 4 分钟

字符串

存储字符串的时候,已知最大长度是m,我们需要定义一个char s[m+1],其中s[m]用来存储字符串结束的'\0'字符。

字符串比较:strcmp函数

在 C 语言中,s == "Tuesday" 这种写法是错误的,原因如下: 根本原因:== 比较的是指针地址,而不是字符串内容

  • 在 C 中,字符串是用字符数组表示的,而字符串常量(如 "Tuesday")是存储在内存中的某个固定位置。
  • s == "Tuesday" 比较的是指针 s 和字符串常量 "Tuesday" 的地址是否相等,而不是字符串的内容是否相等。
  • 即使 s 的内容是 "Tuesday",它指向的内存地址与 "Tuesday" 常量所在的内存地址不会相同,因此条件永远不会成立。

  • 在 C 中,要比较两个字符串的内容是否相同,必须使用 strcmp 函数。
  • 例如:
C
if (strcmp(s, "Tuesday") == 0)
    return 2;

strcmp 的功能: - 它比较两个字符串的内容,返回: - 0:字符串相等。 - 负值:第一个字符串小于第二个字符串。 - 正值:第一个字符串大于第二个字符串。 - 这是 C 标准库提供的函数,专门用于解决字符串内容比较的问题。


C
int getindex(char *s) {
    const char *weekdays[] = {
        "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"
    };
    for (int i = 0; i < 7; i++) {
        if (strcmp(s, weekdays[i]) == 0) {
            return i;
        }
    }
    return -1;
}

Note

为什么使用const char *weekdays[]而不是 const char weekdays[] - const char *weekdays[] 是一个数组,数组元素是指针,指向字符串常量。 - const char weekdays[] 是一个数组,数组元素是字符串常量。我们后面存储的是字符串,不是单个字符串存储到整个数组中。


指定位置输出字符串

题干

本题要求实现一个函数,对给定的一个字符串和两个字符,打印出给定字符串中从与第一个字符匹配的位置开始到与第二个字符匹配的位置之间的所有字符。

函数接口定义: char *match( char *s, char ch1, char ch2 ); 函数match应打印s中从ch1ch2之间的所有字符,并且返回ch1的地址。

裁判测试程序样例:

C
#include <stdio.h>

#define MAXS 10

char *match( char *s, char ch1, char ch2 );

int main()
{
    char str[MAXS], ch_start, ch_end, *p;

    scanf("%s\n", str);
    scanf("%c %c", &ch_start, &ch_end);
    p = match(str, ch_start, ch_end);
    printf("%s\n", p);

    return 0;
}
/* 你的代码将被嵌在这里 */

输入样例1:

Bash
program
r g

输出样例1:

Bash
rog
rogram

输入样例2:

Bash
program
z o

输出样例2:

Bash
(空行)
(空行)

输入样例3:

Bash
program
g z

输出样例3:

Bash
gram
gram

解答:

C
#include<string.h>
char *match( char *s, char ch1, char ch2 ){
    for(int i=0;i<strlen(s);i++){
        if(s[i]==ch1){
            for(int j=i;j<strlen(s);j++){
                printf("%c",s[j]);//只要找到了ch1就开始输出
                if(s[j]==ch2)
                break;//直到输出到ch2
            }
            printf("\n");
            return (s+i);
        }
    }
    printf("\n");
    return s+strlen(s);//注意没找到返回最后的‘\0’的地址
    //什么都没找到也要返回一个地址,并且打印出来为空,就是字符串最后一个地址
}
  • 首先,我们定义了一个函数match,它接受三个参数:字符串sch1ch2
  • 然后,我们使用strlen函数获取字符串s的长度,并遍历字符串s的每一个字符。
  • 如果当前字符s[i]等于ch1,我们就开始一个新的循环,遍历s的每一个字符,直到找到ch2
  • 我们打印出s中从ch1ch2之间的所有字符,并在最后加上一个换行符。
  • 最后,我们返回ch1的地址。
  • 注意,如果ch1没有出现在s中,我们也打印出一个换行符,并返回s的最后一个地址。

查找子字符串

题干

本题要求实现一个字符串查找的简单函数。

函数接口定义: char *search( char *s, char *t ); 函数search在字符串s中查找子串t,返回子串t在s中的首地址。若未找到,则返回NULL。

裁判测试程序样例:

C
#include <stdio.h>
#define MAXS 30

char *search(char *s, char *t);
void ReadString( char s[] ); /* 裁判提供,细节不表 */

int main()
{
    char s[MAXS], t[MAXS], *pos;

    ReadString(s);
    ReadString(t);
    pos = search(s, t);
    if ( pos != NULL )
        printf("%d\n", pos - s);
    else
        printf("-1\n");

    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例1:

Bash
The C Programming Language
ram

输出样例1:

Bash
10

输入样例2:

Bash
The C Programming Language
bored

输出样例2:

Bash
-1

C
char *search( char *s, char *t )
{
    int i=0,j=0,k;
    for(i=0;s[i]!='\0';i++)
    {
        k=i;
        j=0;//每次比较都从t所指的第一个开始比较
        while(s[k]==t[j]&&s[k]!='\0'&&t[j]!='\0')
        //判断时要考虑两个是否为\0,如果有一个是则跳出
        {
            k++;
            j++;
        }
        if(j!=0&&t[j]=='\0')
            break;//找到子串了就跳出
    }
    if(s[i]!='\0')
    {
        s=i+s;      //更新地址,返回字串的首地址i
        return s;
    }
    return NULL;//如果s[i]=='\0'说明没找到
}