编程C本: 帖子 10 – 字符串在C

根本 在c输入发 我们已经熟悉如何声明, 进入和串用C简单. 在这篇文章中,我们将更多地谈论的例子, 作业链 .

1. 概观

的字符串被视为一个阵列 1 char类型的字符元素的尺寸, 数字和特殊字符,如 +, -, *, /, $, #,...
按照惯例, 的序列将由空字符被终止 (“ 0” : 注册turong).
例: 字符串“信息世界”存储如下:

如何存储串

如何存储串

2. 有些声明, 初始化字符串

我们考虑下面的例子:

// e.g about string - code by nguyenvanquan7826
#include <stdio.h>

int main() 
{
    // khai bao chuoi co toi da 50 ky tu
    char name[50]; 
    printf("Hi, What is your name? \nMy name is: ");
    gets(name);
    printf("Hi %s, welcome to C language\n", name);

    // khoi tao chuoi ngay khi khai bao
    char myLove[] = "Nguyen Thi Lap Lanh";
    puts(myLove);

    return 0;
}

结果:

你好, 你叫什么名字?
我的名字是: 阮文权
嗨阮文权, 欢迎到C语言
阮氏闪耀

在程序上, 我已经使用了功能 看跌期权 打印出来的字符串MyLove麦纳, 这也是输出字符串的函数.

正如上面我们可以看到的是申报链或中链再进口报关字符串值赋给恰到好处. 但是我们不能宣布然后分配值如下:

char name[50];
name = "Nguyen Van Quan"; // error

凡要声明,然后赋值, 我们必须使用字符串复制功能 的strcpy 在图书馆 文件string.h 保存值如下:

// e.g about string - code by nguyenvanquan7826
#include <stdio.h>
#include <string.h>

int main() 
{
    char name[50];
    strcpy(name, "Nguyen Van Quan");
    puts(name);

    return 0;
}

3. 在C字符串的一些例子

3.1 例 1: 数字符串中的单词数

请输入字符串并计算字符串中的单词数. VD链 “阮文权” 有 3 从.

要做到这一点, 我们看到每个连续的字符扩词用空格. 因此,本文将提供给数字符串中的空格数. 如果string 1 一句话,没有空格, 字符串 2 从那里 1 之间的空间 2 从此. Ñ一般是从,将有n-1个空间.

接下来的问题是怎么算的空间? 简单, 它一直被称为第一开口字符串是字符数组, 因此,我们可以浏览文字转向检查字符链是空间. 但要浏览的字符串中的所有字符 (字符数组) 他们必须知道字符的字符串中的数字 (数组中元素的数目).

幸运的是,在图书馆 文件string.h 我们有一个函数来获取字符串的长度作为函数 strlen的. (海峡 – 串, 只 – 长度).

// e.g about string - code by nguyenvanquan7826
#include <stdio.h>
#include <string.h> // for strlen function

int main() 
{
    char s[50];
    printf("Enter a string: ");
    gets(s);

    int i, count = 0; // count - bien dem so luong dau cach
    for (i = 0; i < strlen(s); i++ )
    {
        if(s[i] == ' ') 
        {
            count++;
        }
    }

    printf("Number word in string is: %d\n", count + 1 );

    return 0;
}

很简单的代码, 你读, 了解和测试NHE.

然而,我们对音符码:

  • 要表示的字符,那么我们就把撇号对, 然后我们把字符串中的引号. 如果上面的空格单引号括起来,我们可以比较 2 用这样的比较字符 2 号码, 还 2 链不能这么比较, 你可以阅读更多关于 比较字符串.
  • 因为字符串是字符数组, 谨借第i个字符的字符串s,那么我们作为数组访问为s[在].
  • 此示例适用较大的链长,只有当 0 并没有多余的白色标志上方, 端或字之间.
  • 像上述循环, 我们的条件 i < strlen(s), 然而再次strlen的一个循环的自然数字符串s的字符数. 因此,如果我们直接写在每个迭代的条件, 程序必须运行命令循环的strlen计算S的字符数. 这是多余的,使程序运行长. 因此,我们将投入 1 变量是字符串的长度按照如下:
int len = strlen(s);
for (i = 0; i < len; i++ )
{
    if(s[i] == ' ') 
    {
        count++;
    }
}

3.2 例 2: 标准化序列

请输入一个字符串,并在顶部去除所有多余的空格, 最后和字之间是否.

这个问题是软件的问题很重要, 后来当存储, 输入数据是值得注意的被标准化, 没有盈余或赤字的过程中造成的错误,并寻求.

  • 字符串s的第一个字符是空格,则s[0] 空间, 我们删除它为处理完毕.
  • 如果冗余即话之间的字符[在] 和s[I 1] 沿空间. 我们删除 1 在 2 是确定, 因为词语将被分离 1 空间应该保留 1 空间.
  • 在结束串字符的空间,那么我们将通过指定的最后一个字符删除它是一个空字符 '\0' 完成. 请记住,最后一个字符数组n的元素 a[n-1], 因此字符串的字符是 s[ strlen(s) - 1 ].

接下来的问题是如何删除 1 字符串中的字符? 你看看上面的例子中,我们使用的字符串复制功能, 并删除 1 或数字字符的字符串,我们将使用此功能,但会在副本中的地址被使用.

要我删除字符到j个字符的字符串s, 我们命令 strcpy(&s[i], &s[j+1]);. 其实质是,我们复制地址 s[j+1] 地址 s[i].

// e.g about string - code by nguyenvanquan7826
#include <stdio.h>
#include <string.h>

int main() 
{
    char s[50];
    printf("Enter a string: ");
    gets(s);

    // delete all space at start of string
    while( s[0] == ' ' ) strcpy(&s[0], &s[1]);

    // delete all space at end of string
    while( s[ strlen(s)-1 ] == ' ') s[ strlen(s)-1 ] = '\0';

    // delete all space between two word 

    int i;
    for(i = 0; i < strlen(s); i++)
    {
        if( s[i] == ' ' && s[i+1] == ' ')
        {
            strcpy(&s[i], &s[i+1]);
            i--; // why???
        }
    }

    printf("s=%s.\n", s);

    return 0;
}

行. 您运行NHE. 回想当初输入字符串多余空间, 最后, 之间检查.

作为演习一个小问题做更多的事情,你是看代码行 i--; // why??? 想想为什么这条线? 为什么我必须减少 1?

4. 在字符串和字符某些功能

测试函数符号. (在库中这些功能 文件ctype.h) 如果为真,功能不同的值 0. 如果为假,通过函数值 0.

  • INT因而isalpha(诠释三) : 检查字母字符都没有.
  • 诠释ISDIGIT(诠释三) : 校验位字符不是.
  • 诠释islower判断(诠释三): 检查小写字符不是.
  • 诠释isupper判断(诠释三): 检查大写字符不是.
  • 诠释iSpace的(诠释三): 校验字符是空的 (\ñ, 空间, \吨).

该字符串处理函数. (该功能位于库 文件string.h)

  • 诠释的strlen(字符* S) 返回的字符串s的长度;
  • 字符* strupr(字符* S) 变化小写为大写字符串s.
  • 字符* strlwr(字符* S) 更改大写改为小写.
  • 的char * strcat的(字符* S1, 字符* S2) 连接串来串S1 S2;
  • 诠释STRCMP(字符* S1, 字符* S2) 负值,如果字符串s1和更小的字符串s2. 而对于价格的难民正面的,如果更多的串串S1 S2. 返回的值 0 如果字符串S1与字符串s2.
  • 诠释strcmpi (字符* S1, 字符* S2) 比较 2 字符串,但不区分小写和大写.
  • 字符*的strcpy(字符* S1, 字符* S2) 复制串来串S1 S2.
  • 字符*函数strncpy(字符* S1, 字符* S2, INTñ) 复制字符串的第n个字符S2串S1
  • 字符* strnset(字符* S ,诠释三, INTñ) n次复制的字符串s的字符c.
  • 字符*的strstr(字符* S1, 字符* S2) 查找字符串s2在字符串s1中出现. 如果您发现该功能的子字符串S1地址. 而相比之下,空.
  • 字符* strrev(字符* S) 使用反向s.Neu成功的字符串函数来处理字符串逆转.

锻炼

  1. 写一个程序,给定字符串名称的独立. VD名为阮氏起泡=>分离亚麻
  2. 编写一个程序,规范自己的名字字符串. 首席执行官:ha noi => Ha Noi.
  3. 写功能开关 1 字符串为小写和 1 函数转换为大写.
  4. 写一个程序到字符串中的字符的字符串,然后看看有多少人信 “的”.
  5. 写一个程序上的绳子. 检查它是否反映串? 对称是串串向后还在写像原来的字符串时. 首席执行官 水平
  6. 写数的程序 3 数字. 所述碑文描述了数的值. 例 123 ->一百23.