精华内容
下载资源
问答
  • 输入两个字符串,从第一个字符串中删除第二个字符串中的所有字符 比如输入“They are students." 删除之后的第一个字符串变成"The r stdnts." 思路是利用每个字符都有其对应的ASCII码值,将需要删除的字符的ascii为...

    输入两个字符串,从第一个字符串中删除第二个字符串中的所有字符
    比如输入“They are students."
    删除之后的第一个字符串变成"The r stdnts."

    思路是利用每个字符都有其对应的ASCII码值,将需要删除的字符的ascii为下标储存在数组当中。
    利用两个指针分别指向原字符串和需要删除的字符串。
    因为我们已经将需要删除的字符串中的字符所对应的ASCII码作为下标储存在数组当中,所以在比较的时候只需要看原字符串中的字符所对应的ASCII码作为下标在数组中是否为1.
    这样说可能不好理解。看一下具体例子

    假如原字符串为

    char str1[] = "They aaaare students.";
    

    需要删除的为

    char str2[] = "aeiou";
    

    然后我们需要一个数组储存结果(将其初始化为0)

    int a[256] = { 0 };
    

    两个指针分别指向这两个字符串

    char* pFast = str1;
    char* pSlow = str2;
    

    我们想实现的是在字符串str1中找到‘a’,‘e’,‘i’,‘o’,‘u’这几个字符并删除
    第一步我们想在str1中找到所有的字符‘a’并删除
    也就是说我们所有想删除的字符都在str2中

    接下来我们把需要删除的字符对应的ASCII码作为下标,然后储存在数组中
    利用一个for循环

    for (i = 0; i < n; ++i){
    	a[str2[i]] = 1;
    }
    

    str2[i]对应的是所有需要在str1中删除的字符
    将其对应的ASCII码作为下标也就是 a[str2[i]];
    将其赋为1,表示该字符需要删除

    接下来实现代码的核心部分

    while (*pFast){
    	if (a[*pFast] == 1){
    		*pFast++;
    	}
    	*pSlow++ = *pFast++;
    }
    

    因为我们需要删除的是str1中的字符,所以这里的 while(pFast)是为了遍历str1
    接下来 if (a[pFast] == 1) 说明我们要删除这个字符。我们给pFast++,让pFast指针跳过这个字符,指到下一个字符,然后再赋给pSlow。
    这样做本质上是遍历str1,如果这个字符不需要删除,就拿过来赋给pSlow,然后pFast和pSlow同时自增
    如果需要删除,先给pFast自增,再
    pSlow++ = *pFast++;(自增同时赋值)

    别忘了最后

    *pSlow = '\0';
    

    给字符串结尾!

    但是这样的思路还存在一些问题。先看上面这个思路的完整代码,我们再来修改

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    void DeleteStr(char* str1, char* str2){
    	char* pFast = str1;
    	char* pSlow = str2;
    	int a[256] = { 0 };
    	int i;
    	int n = strlen(str2);
    	for (i = 0; i < n; ++i){
    		a[str2[i]] = 1;
    	}
    	while (*pFast){
    		if (a[*pFast] == 1){
    			*pFast++;
    		}
    		*pSlow++ = *pFast++;
    	}
    
    	*pSlow = '\0';
    }
    int main(){
    	char str1[] = "They are students.";
    	char str2[] = "aeiou";
    	DeleteStr(str1, str2);
    	printf("%s\n", str2);
    	system("pause");
    	return 0;
    }
    

    这样去做题目中的要求我们可以实现,但是拓展之后,如果相同的字符连续出现,我们无法做到连续删除

    比如原字符串变成这样

    char str1[] = "They aaaare students.";
    

    仔细想想,来看我们上面的核心代码

    while (*pFast){
    	if (a[*pFast] == 1){
    		*pFast++;
    	}
    	*pSlow++ = *pFast++;
    }
    

    我们在确认一个字符需要删除之后,直接就跳过该字符,下一个字符没有进行判断是否应该删除就进行了赋值
    所以要将这段代码进行修改

    while (*pFast){
    	if (a[*pFast] == 0){
    		*pSlow = *pFast;
    		pSlow++;
    	}
    	pFast++;
    }
    

    这次我们判断

    if (a[*pFast] == 0){}
    

    就说明不需要删除可以赋值
    直接

    *pSlow = *pFast
    

    紧接着下来的一步我们不着急赋值,因为我们最终使用pSlow保存的结果,所以每赋值一次就先给pSlow++,这是pSlow++放在if语句中的原因。试想如果将pSlow++放在if语句之外,那么我们没有给pSlow赋值,指针也会不断往前走,这样肯定会出问题。
    先给pSlow++之后,在if语句之外给先给pFast++
    这时开始第二次循环
    这样做就能够实现在每一次赋值之前进行判断,就算相同字符连续出现也可以实现删除
    完整代码如下

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    void DeleteStr(char* str1, char* str2){
    	char* pFast = str1;
    	char* pSlow = str2;
    	int a[256] = { 0 };
    	int i;
    	int n = strlen(str2);
    	for (i = 0; i < n; ++i){
    		a[str2[i]] = 1;
    	}
    	while (*pFast){
    		if (a[*pFast] == 0){
    			*pSlow = *pFast;
    			pSlow++;
    		}
    		pFast++;
    	}
    	*pSlow = '\0';
    }
    int main(){
    	char str1[] = "They aaaare students.";
    	char str2[] = "aeiou";
    	DeleteStr(str1, str2);
    	printf("%s\n", str2);
    	system("pause");
    	return 0;
    }
    
    展开全文
  • C++字符串输入

    千次阅读 2019-04-08 09:46:10
    ” 提供了 C++ 语言的字符串输入字符串输出功能。"<<" 可以将字符读入一个流中(例如 ostream);">>" 可以实现将以空格或回车为 "结束符" 的字符序列读入到对应的字符串中,并且开头和结尾的空白字符...

    一.cin

    使用cin输入时,程序将输入视为一系列字节。每个字节都被解释为字符编码。不管数据类型是什么,输入一开始都是字符数据,然后cin对象负责将数据转换成其他类型。当你输入Michael Jackon时,通运行程序你会发现name只存储了Michael,这是为什么呢?

    原来是cin使用空白(空格,制表符和换行符)来确定字符串的结束位置在读取字符数组时,cin将只会读取第一个单词,cin将该字符串放到数组中,并自动添加空字符Michael Jackon 之间的空格被当作结束符了,而Jackon被继续留在输入队列中,直到下一次读取输入。

    二.getline()和cin.getline()

    两者的功能基本相同都可以接受空格,且会把换行符进行丢弃,但是cin.getline()属于istream流,而getline()属于string流,是不一样的两个函数。getline定义在string中,getline利用cin可以从标准输入设备键盘读取一行,当遇到如下三种情况会结束读操作:1)到文件结束,2)遇到函数的定界符,3)输入达到最大限度。

    “<<” 和 “>>” 提供了 C++ 语言的字符串输入和字符串输出功能。"<<" 可以将字符读入一个流中(例如 ostream);">>" 可以实现将以空格或回车为 "结束符" 的字符序列读入到对应的字符串中,并且开头和结尾的空白字符不包括进字符串中。

    cin从输入流中读取数据时通常会跳过输入流中的空格、制表符、换行符等空白字符。

    还有一个常用的 getline() 函数,该函数的原型包括两种形式:

    template <class CharType, class Traits, class Allocator > basic_istream<CharType, Traits>& getline (basic_istream<CharType, Traits>& _Istr,basic_string <CharType,Traits, Allocator> &_Str);
    //上述原型包含 2 个参数:第 1 个参数是输入流;第 2 个参数是保存输入内容的字符串
    template <class CharType, class Traits, class Allocator> basic_istream<CharType, Traits>& getline (basic_istream <CharType, Traits>&_ Istr, basic_string <CharType, Traits, Allocator>& _Str,CharType_Delim);
    //上述原型包含 3 个参数:第 1 个参数是输入流,第 2 个参数保存输入的字符串,第 3 个参数指定分界符。
    
    

    该函数可将整行的所有字符读到字符串中。在读取字符时,遇到文件结束符、分界符、回车符时,将终止读入操作,且文件结束符、分界符、回车符在字符串中不会保存;当已读入的字符数目超过字符串所能容纳的最大字符数时,将会终止读入操作。
    下面分别按上述两种函数原型举例说明,参见下述程序:

    #include <iostream>
    #include <string>
    using namespace std;
    void main ()
    {
    string s1, s2;
    getline(cin, s1);
    getline(cin, s2, ' ');//指定空格为分界符
    cout << "You inputed chars are: " << s1 << endl;
    cout << "You inputed chars are: " << s2 << endl;
    }
    程序的执行结果为:
    123456
    asdfgh klj
    You inputed chars are: 123456
    You inputed chars are: asdfgh
    

    注意,程序中输入的第二行字符中间包含空格字符,而空格之后的字符没有被存储到字符串 s2 中。https://blog.csdn.net/u011486738/article/details/82082405

    展开全文
  • 今天做作业遇见了在程序中创建一个文件并让用户自己输入文件名,跟同学讨论了一下,感觉可以用字符串操作在c中实现这个功能。 #include #include int main(int argc, const char * argv[]) { ...

    今天做作业遇见了在程序中创建一个文件并让用户自己输入文件名,跟同学讨论了一下,感觉可以用字符串操作在c中实现这个功能。

    #include <stdio.h>

    #include <string.h>


    int main(int argc, const char * argv[])

    {

        

        FILE *fp;

        char filename[30];//用户想要更改的文件名

        char way[100];//路径名  这里没有用动态分配内存也是个缺陷。

        

        //用户输入文件名

        printf("请输入要保存的文件名\n");

        scanf("%s",filename);//获取文件名

        

        strcpy(way, "//Users//mac//Desktop//");//先把路径复制到字符串中

        //注:系统不同路径名也不一样,根据自己的情况改。

        

        strcat(way, filename);  //路径和文件名连接起来

        strcat(way, ".txt");    //默认文件类型为.txt也可以根据要求改


        fp = fopen(way,"w"); //以写的方式打开文件

        if (fp==0) {

            printf("打开文件失败");

            return 0;

        }

        

        //打开文件后对文件的相关操作

    ......

        

        //关闭文件

        fclose(fp);

     

        return 0;

    }




    展开全文
  • 利用递归将输入字符串倒序输出

    千次阅读 2020-02-05 12:16:09
    进而返回到printb()和printa()中执行打印字符的代码。 # include void print ( ) { char a ; scanf ( "%c" , & a ) ; if ( a != '#' ) print ( ) ; if ( a != '#' ) printf ...

    B站视频-https://www.bilibili.com/video/av21828275?p=33
    在这里插入图片描述
    我们用 printa(),printb(),printc() 来分别代表上图中从左到右出现的三个 print() 函数。在运行printc()的时候,会遇到"#",所以printc()中第一个if条件不满足,进而判断第二个if语句,第二个if语句也不成立,所以“#”符号不会打印到屏幕上。至此,printc()函数执行完毕,换句话说,printb()中的中第一个if块执行完,所以此时执行第二if块,这个时候a!=’#’,打印符号‘C’到屏幕上。进而返回到printb()和printa()中执行打印字符的代码。

    #include <stdio.h>
    
    void print()
    {
        char a;
        scanf("%c", &a);
        if (a!= '#')
            print();
        if (a!='#')
            printf("%c",a);
    } 
    int main()
    {
    	print();
    	return 0;
    }
    
    展开全文
  • 常用字符串函数strcat(s1,s2)可将字符串s2添加到字符串s1的末端,但其使用必须保证字符串s1足够大,以便保存它自己的内容和字符串s2中的内容。  请编写一个函数char*append(char*s1,char*s2),其可将字符串s2添加...
  • 0A中断会向保存在dx中的地址存放来自键盘的输入。...返回值[dx+1]是你实际输入的字符个,dx+2是字符串首。 代码示例: datas segment input db 7,?,7 dup(?) datas ends codes segment assume datas:ds,cod...
  • 在C/C++语言中没有专门的字符串变量,通常用字符数组来存放字符串字符串是以“\0”作为结束符。C/C++提供了丰富的字符串处理函数,下面列出了几个最常用的函数。  ● 字符串输出函数puts。  ● 字符串输出函数...
  • 三、格式化字符串漏洞 原文:Exploiting Format String Vulnerabilities 作者:scut@team-teso.net 译者:飞龙 日期:2001.9.1 版本:v1.2 格式化字符串漏洞的通常分类是“通道问题”。如果二类不同的...
  • c++字符串与c字符串

    千次阅读 多人点赞 2019-05-27 19:32:26
    字符串字面量3.C++ std::string 类3.1 C风格字符串的优势和劣势3.2 使用string类3.2.1 std::string 字面量3.2.2 c++字符串的数值转换(1)字符串转数值(2)数值转字符串3.2.3 常用字符串函数3.2.4 原始字符串字面量 ...
  • 从实参传入字符串到形参进行统计,形参统计字符的数量时会用到循环,但我们输入字符串是随机的,并没有准确的量。 另外循环中给定的条件,必须要达到条件满足时才可停止。举个例子,假设循环结束条件是 i<=10,...
  • C++ 字符串与字符数组 详解

    万次阅读 多人点赞 2018-03-03 19:28:22
    在C++中,有两种类型的字符串表示形式: C-风格字符串 C++引入的string类 C-风格字符串 C 风格的字符串起源于 C 语言,并在 C++ 中继续得到支持。字符串实际上是使用 null 字符 ‘\0’ 终止的一维字符数组。...
  • 我们可以使用递归来逆序输入字符串: #include void reverse(); int main() {  printf("输入:");  reverse();  return 0; } void reverse() {  char c; //这里每个函数都分配一个变量c  scanf...
  • 利用一个字符数组作函数参数,实现字符串(最大长度为80个字符 )的逆序存放。 要求如下: (1)在子函数Inverse中实现字符串的逆序存放。函数原型为: void Inverse(char str[]); (2)在主函数中 从键盘输入字符串(使用...
  • 输入2 个字符串S1 和S2,要求删除字符串S1 中出现的所有子串S2 题目内容: 输入2 个字符串S1 和S2,要求删除字符串S1 中出现的所有子串S2,即结果字符串中不能包含S2。 提示:输入数据的设计使得不可能出现输出为空...
  • 求已知字符串的最大回文字符串长度,并输出该...输入分析:C语言的常用输入字符串函数scanf(),gets()都不适合本题,scanf()会有输入不了空格的麻烦,gets会出现缓存区溢出漏洞,已经被废弃(vs2012代替的是get_s(),但
  • 一、字符串输入 想把字符串读到程序中,必须首先预留存储字符串的空间,然后使用输入函数来获取这个字符串。需要分配足够大的存储区来存放希望读入的字符串,不要指望计算机读的时候会先计算字符串的长度,然后为...
  • C语言字符串与数字相互转换

    万次阅读 2018-10-31 19:00:38
    在C/C++语言中没有专门的字符串变量,通常用字符数组来存放字符串字符串是以“\0”作为结束符。C/C++提供了丰富的字符串处理函数,下面列出了几个最常用的函数。  ● 字符串输出函数puts。  ● 字符串输出函数...
  • 一、数字转换为字符串 1.1 解题思路 不使用库函数实现数字转换为字符串,此时必须借助ASCII码进行转换,我们知道字符‘0’与数字0直接ASCII码值相差48,要将对应数字转换为字符,只需加上字符‘0’即可,但是此时...
  • 从键盘输入一系列字符(以回车符结束,字符的个数不超过 200 个),统计输入字符串中数字与非数字字符的个数,并将计数结果输出。 DATA SEGMENT BUFF DB 255,?,255 DUP('$') NUM DB ? ;字符串中数字个 OTHER DB...
  • C#中如何从字符串中提取数字

    千次阅读 2019-05-21 20:29:34
    using System.Text.RegularExpressions;//www.uzhanbao.com Console.WriteLine("请输入要提取的字符串:"); string str = Console.ReadLine(); int number = 0; string num = null; ...
  • Python 字符串

    千次阅读 2017-05-10 18:12:12
    字符串(String),是由零个或多个字符组成的有限序列,在 Python 中表示文本的数据类型。 字符只是一个符号,例如:字母(A-Z)、数字(0-9)、特殊符号(~!@#¥%...)等。
  • 例如,输入483,应输出字符串“483”。n的位数不确定,可以是任意位数的整数。不用归纳法:代码块:#include <stdio.h> #include <math.h>main() { int number, i, j, k, bit, n[6]; char c[6];
  • /*编程从键盘输入两个字符串, 比较两者的长度,并输出较长的字符串。要求:不能调用库函数strlen()*/ #include<stdio.h> main() { char a[20],b[20],n1,n2,i; printf("请输入第一个字符串:"); gets(a); ...
  • C字符串和C++字符串的区别

    千次阅读 2016-05-10 14:03:32
    C字符串和C++字符串  在C中,并没有字符串这个数据类型,而是使用字符数组来保存字符串。C字符串实际上就是一个以null('\...C字符串定义时可以利用"="号进行初始化,但是以后不能利用"="对C字符串进行赋值。对C字
  • 输入一个字符串,长度小于等于200,然后将输出按字符顺序升序排序后的字符串输入: 测试数据有多组,输入字符串。 输出: 对于每组输入,输出处理后的结果。 样例输入: bacd 样例输出: abcd ...
  • c语言输入输出多个字符串

    万次阅读 2015-01-15 14:01:30
    #include #include int main() { char str[50][50]; char *ps[50];... scanf()函数接受输入以后,回车被保存输入流中了, 你在scanf()后面加一个getchar()就好了。 这样会吃 掉多余的回车符,后面的g
  • 编写程序,循环接收用户从键盘输入多个字符串,直到输入“end”时循环结束,并将所有已输入字符串按字典顺序倒序打印。 package yang.base; import java.util.ArrayList; import java.util.Arrays; import java...
  • 不定长字符串输入处理小技巧

    千次阅读 2009-11-26 08:31:00
    大家在编程的过程中,经常会遇到需要输入一个不定长字符串的情况。通常来说,解决这个问题可以有两种方法: 一是先分配一个固定长度的缓冲区,把输入字符串先存储到这个缓冲区,然后再根据其长度动态分配内存。这...
  • Linux 格式化字符串漏洞利用

    千次阅读 2017-05-18 22:32:20
    格式化字符串危害最大的就两点,一点是leak memory,一点就是可以在内存中写入数据,简单来说就是格式化字符串可以进行内存地址的读写。下面结合着自己的学习经历,把漏洞详细的讲解一下,附上大量的实例。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 224,843
精华内容 89,937
关键字:

利用字符串保存输入的数