首页 > 其他分享 >字符串1

字符串1

时间:2024-11-26 18:24:00浏览次数:5  
标签:int char str printf 字符串 include

一、字符串的基本概念

字符串的存储结构

在 C 语言中,字符串本质上是 字符数组,并以 空字符 \0 结尾。

存储特点:

  1. 每个字符占一个字节
    • 在 ASCII 编码中,一个字符(如 Aa)占用 1 个字节。
    • 一个字符串的长度是字符个数加 1(空字符 \0)。
  2. 连续存储
    • 字符数组中的每个字符都连续存储在内存中,直到 \0 为止。
  3. 只读字符串
    • 用双引号定义的字符串常量,如 "Hello",通常存储在只读内存中,无法直接修改。

示例:定义与初始化字符串

#include <stdio.h>

int main() {
    char str1[] = "Hello"; // 自动在末尾添加 '\0'
    char str2[] = {'H', 'e', 'l', 'l', 'o', '\0'}; // 显式指定 '\0'

    printf("str1: %s\n", str1); // 输出 Hello
    printf("str2: %s\n", str2); // 输出 Hello

    // 错误示例(缺少 '\0' 会导致输出乱码)
    char str3[] = {'H', 'e', 'l', 'l', 'o'}; 
    printf("str3: %s\n", str3); // 可能输出 Hello 后接乱码
    return 0;
}

二、字符串的输入与输出

示例:字符串输入与输出

#include <stdio.h>

int main() {
    char name[50];

    // 使用 scanf
    printf("请输入你的名字:");
    scanf("%s", name); // 以空格或换行符为结束标志
    printf("Hello, %s!\n", name);

    // 使用 fgets
    printf("请输入一句话:");
    getchar(); // 清除上次输入的换行符
    fgets(name, sizeof(name), stdin); // 输入整行,自动包含换行符
    printf("你输入的是:%s", name); // 自动输出换行符

    return 0;
}

注意fgets 读取的字符串会包含换行符,必要时可以手动去掉:

name[strcspn(name, "\n")] = '\0'; // 移除换行符

字符串常见错误及防范

  1. 未初始化的字符串

    • 如果定义了字符数组但没有初始化,可能会包含垃圾值。
    char str[10]; // 未初始化
    printf("%s\n", str); // 可能输出随机内容
    
  2. 忘记空字符 \0

    • 手动定义字符串时,忘记加 \0 会导致错误。
    char str[] = {'H', 'e', 'l', 'l', 'o'}; // 缺少 '\0'
    printf("%s\n", str); // 输出可能会超出预期
    
  3. 数组越界访问

    • 超过数组边界的访问会导致不可预知的行为。
    char str[5] = "Test"; 
    str[5] = 'X'; // 错误:越界访问
    

三、字符串操作函数

C 标准库提供了许多操作字符串的函数,以下以具体示例讲解常用的函数。

1. 字符串长度:strlen

#include <stdio.h>
#include <string.h>

int main() {
    char str[] = "Hello, C!";
    size_t len = strlen(str); // 计算长度
    printf("字符串 \"%s\" 的长度是:%lu\n", str, len); // 输出 9
    return 0;
}

2. 字符串复制:strcpystrncpy

#include <stdio.h>
#include <string.h>

int main() {
    char src[] = "Source";
    char dest[20];

    // 使用 strcpy
    strcpy(dest, src);
    printf("复制结果:%s\n", dest); // 输出 Source

    // 使用 strncpy
    strncpy(dest, "Example", 3); // 只复制前 3 个字符
    dest[3] = '\0'; // 手动添加 '\0'
    printf("部分复制结果:%s\n", dest); // 输出 Exa

    return 0;
}

3. 字符串连接:strcatstrncat

#include <stdio.h>
#include <string.h>

int main() {
    char str1[50] = "Hello";
    char str2[] = ", World!";

    // 使用 strcat
    strcat(str1, str2); // 拼接字符串
    printf("拼接后:%s\n", str1); // 输出 Hello, World!

    // 使用 strncat
    strncat(str1, " C Programming", 3); // 只拼接前 3 个字符
    printf("部分拼接后:%s\n", str1); // 输出 Hello, World! C

    return 0;
}

4. 字符串比较:strcmpstrncmp

#include <stdio.h>
#include <string.h>

int main() {
    char str1[] = "apple";
    char str2[] = "banana";

    int cmp = strcmp(str1, str2); // 比较字符串
    if (cmp < 0)
        printf("\"%s\" 小于 \"%s\"\n", str1, str2);
    else if (cmp > 0)
        printf("\"%s\" 大于 \"%s\"\n", str1, str2);
    else
        printf("\"%s\" 等于 \"%s\"\n", str1, str2);

    // 使用 strncmp
    cmp = strncmp("abcde", "abcfg", 3); // 只比较前 3 个字符
    printf("strncmp 比较结果:%d\n", cmp); // 输出 0(前 3 个字符相等)

    return 0;
}

5. 字符串查找:strchrstrstr

#include <stdio.h>
#include <string.h>

int main() {
    char str[] = "Hello, World!";

    // 查找字符
    char *pos = strchr(str, 'W');
    if (pos)
        printf("找到字符 'W',位置:%ld\n", pos - str);

    // 查找子串
    char *substr = strstr(str, "World");
    if (substr)
        printf("找到子串 \"World\",起始位置:%ld\n", substr - str);

    return 0;
}

四、综合练习

示例 1:统计字符串中的字符个数

#include <stdio.h>
#include <string.h>

int main() {
    char str[100];
    printf("请输入一个字符串:");
    fgets(str, sizeof(str), stdin);

    // 去掉换行符
    str[strcspn(str, "\n")] = '\0';

    printf("字符串 \"%s\" 的长度是:%lu\n", str, strlen(str));
    return 0;
}

示例 2:字符串逆序

#include <stdio.h>
#include <string.h>

void reverse(char *str) {
    int len = strlen(str);
    for (int i = 0; i < len / 2; i++) {
        char temp = str[i];
        str[i] = str[len - i - 1];
        str[len - i - 1] = temp;
    }
}

int main() {
    char str[100];
    printf("请输入一个字符串:");
    fgets(str, sizeof(str), stdin);

    // 去掉换行符
    str[strcspn(str, "\n")] = '\0';

    reverse(str);
    printf("逆序后的字符串是:%s\n", str);
    return 0;
}

总结

  1. 逐步练习: 先熟悉基本操作(输入输出),再学习字符串操作函数。
  2. 重点注意: 字符串数组需要足够的空间,并要防止输入过长。
  3. 实际应用: 多练习一些常见题目,如字符串统计、翻转、查找等。

五、字符串的实际应用

1. 字符串处理

字符串在 文本处理加密数据存储 等场景中非常常见。

示例:统计字符串中某个字符出现的次数

#include <stdio.h>
#include <string.h>

int countChar(const char *str, char ch) {
    int count = 0;
    while (*str) {
        if (*str == ch) count++;
        str++;
    }
    return count;
}

int main() {
    char str[100];
    printf("请输入一个字符串:");
    fgets(str, sizeof(str), stdin);

    char ch;
    printf("请输入要统计的字符:");
    scanf(" %c", &ch);

    printf("字符 '%c' 出现了 %d 次。\n", ch, countChar(str, ch));
    return 0;
}

标签:int,char,str,printf,字符串,include
From: https://www.cnblogs.com/lyx9785/p/18570749

相关文章

  • 字符串
    字符串是计算机编程中表示文本数据的一种基本数据类型,在C语言中,字符串是以字符数组的形式实现的,并且每个字符串都以空字符\0结尾,这个空字符标志着字符串的结束。下面从基础到深入讲解字符串的相关知识点:1.字符串的定义与表示字符串在C语言中使用字符数组表示,例如:charstr[......
  • 代码随想录算法训练营第十天(LeetCode232.用栈实现队列;LeetCode225.用队列实现栈;LeetCo
    LeetCode232.用栈实现队列题目链接:用栈实现队列题目链接思路队列是先进先出,栈是先进后出,为了能够让栈可以模拟队列的先进先出,我们设置两个栈,一个栈作为入栈,一个栈作为出栈,我们在入栈存储完数据后,将入栈中的数据全部存储到出栈中,那么从出栈中弹出来的数据就是先进先出的......
  • PHP 带中文字符串截取
    PHP中带有中文字符串的截取可以直接使用substr方法,无需使用mb_substr。<?php$s='<?xmlversion="1.0"?><S:Envelopexmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><ns2:queryTablesResponsexmlns:ns2="http://web.......
  • js中在将字符串数字转为数字时,使用哪种方式更安全
    在JavaScript中,将字符串数字转换为数字时,有几种常见的方法,但每种方法都有其适用场景和潜在的风险。为了确保转换的安全性和准确性,建议使用以下方法:1.Number构造函数Number构造函数是最直接和安全的方法之一,它可以处理各种数字格式,包括整数、浮点数和科学计数法。conststr......
  • Day39--连接两个字符串
    Day39--连接两个字符串在Java中,要连接两个字符串,可以使用+运算符或者String类的concat方法。使用+运算符示例代码如下:StringfirstName="John";StringlastName="Doe";System.out.println(firstName+lastName);在这个例子中,firstName和lastName通过+运算符......
  • 【leetcode100】找到字符串中所有字母异位词
    1、题目描述给定两个字符串s和p,找到s中所有p的异位词异位词的子串,返回这些子串的起始索引。不考虑答案输出的顺序。示例1:输入:s="cbaebabacd",p="abc"输出:[0,6]解释:起始索引等于0的子串是"cba",它是"abc"的异位词。起始索引等于6的子串是......
  • Jackson:Java对象和JSON字符串的转换处理库使用指南
    Jackson介绍Jackson是一个非常流行的JavaJSON处理库,它能够将Java对象与JSON字符串相互转换。Jackson工具主要用于将请求的参数(例如前端发送的JSON数据)和响应的数据(例如后端返回给前端的数据)转换成Java对象,或者将Java对象转换为JSON格式的字符串。使用示......
  • 统计字符串中整数个数并分别输出数字(超级详细)
    【问题描述】输入一行字符串,不要超过80个字符,含有数字和非数字字符以及空格等,如:df23adfd562343?23dgjop535如果将其中所有连续出现的数字视为一个整数,要求统计在该字符串中共有多少个整数,并将这些数依次输出。【输入说明】只有一行,含有数字和其它任意字符。该行最长含80......
  • 一篇文章看懂字符串哈希
    定义将一个字符串映射至一个整数\(w\)后称\(w\)为该字符串的\(hash\)值。性质对于一个固定的字符串,其在使用相同\(hash\)生成方式下得到的\(hash\)值唯一,而且对于每一个固定的\(hash\)值,其所对应的字符串在很大概率下是唯一的,因此我们在求出字符串的\(hash\)值后可以通过判断两......
  • 关于C语言 字符串(字符数组)s
    关于charC语言中的字符型用关键字char表示,它实际存储的是ASC码。字符常量可以用单引号法表示。在语法上可以把字符当做int型使用。字符串的实际长度每次存储字符串,应多分配字符个数加1,因为C语言的字符串被读取后会添加空字符"\0"结尾例如:存储"2357"到chara[20]中,a会存储......