c语言问题,字符串?

作者&投稿:管蓝 (若有异议请与网页底部的电邮联系)
~

该代码使用了STL中的vector、map等容器以及C++11中引入的random库,实现了任意关键词随机替换颜表情的功能。具体实现思路是先将关键词和颜表情建立映射关系,然后使用find函数在文本中查找关键词,找到之后将其替换为对应的颜表情。



这个程序使用了一个自定义的函数 replaceKeywordsWithEmoticons,它会遍历输入字符串中的每个字符,并检查是否存在一个关键词。如果找到关键词,它会将其替换成一个随机的颜文字表情。如果没有找到关键词,它会将该字符复制到输出字符串中。程序使用 strncmp 函数来比较字符串,这比 strstr 函数更加高效。程序中还使用了宏定义和数组来简化代码。

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

#define NUM_KEYWORDS 6
#define MAX_KEYWORD_LEN 10
#define MAX_EMOTICON_LEN 10

char keywords[NUM_KEYWORDS][MAX_KEYWORD_LEN] = {"happy", "sad", "love", "angry", "excited", "tired"};
char emoticons[NUM_KEYWORDS][MAX_EMOTICON_LEN] = {":-)", ":-((", "<3", ">:(", ":-D", ":-|"};

void replaceKeywordsWithEmoticons(char *input, char *output) {
// Initialize the random number generator
srand(time(NULL));

int inputLen = strlen(input);
int outputLen = 0;
int i = 0;

while (i < inputLen) {
int keywordFound = 0;
int j = 0;

// Check if a keyword is found
for (j = 0; j < NUM_KEYWORDS; j++) {
if (strncmp(&input[i], keywords[j], strlen(keywords[j])) == 0) {
// A keyword is found, replace it with a random emoticon
int emoticonIndex = rand() % NUM_KEYWORDS;
strcpy(&output[outputLen], emoticons[emoticonIndex]);
outputLen += strlen(emoticons[emoticonIndex]);
i += strlen(keywords[j]);
keywordFound = 1;
break;
}
}

// If no keyword is found, copy the character as it is
if (!keywordFound) {
output[outputLen] = input[i];
outputLen++;
i++;
}
}

// Null terminate the output string
output[outputLen] = '\0';
}

int main() {
char input[1000];
char output[1000];

printf("Please enter your text: ");
fgets(input, sizeof(input), stdin);

replaceKeywordsWithEmoticons(input, output);

printf("Output: %s\n", output);

return 0;
}

你好!很高兴为你解答:字符串

c 语言没有专门用于存储字符串的变量类型,字符串都被存储在 char 类型的数组中。数组由连续的存储单元组成,字符串中的字符被存储在相邻的存储单元中,每个单元存储一个字符,c 语言用数组末尾的字符 \o 标记字符串的结束。
c 中的字符串一定是以空字符结束,这意味着数组的容量必须至少比待存储字符串的字符数多 1,以上图中有14个存储单元,却只能存储13个字符,剩下一个字节留给空字符。
字符串常量

用双引号括起来的内容称为字符串的字面量,也叫做字符串常量。双引号中的字符和编译器自动加入末尾的 \0 字符,都作为字符串存储在内存中,如:” hello world ! ” 、” good morning “ 、 “ i am a student ” 都是字符串字面量。另外注意一点,你的字符串字面量之间如果没有间隔,或用空白字符分隔,c 会自动将它们串联起来。
#include<stdio.h>
int main(void)
{
char a[]="hello ""world " "!";
char b[]="hello world !";

printf("a[]=%s b[]=%s\n",a,b);

return 0;

}

它们的输出是相同的:

字符串变量

我们字符串变量一般有两种方法创建,指针或者是数组
#include<stdio.h>
int main(void)
{
char a[]="hello world !"; //数组
char* b=" hello world !"; //指针

}
数组形式( a [ ] )在计算机的内存中分配为一个内含14个元素的数组,每个元素初始化为字符串字面量对应的字符。通常,字符串都作为可执行文件的一部分存储在数据段中。当把程序载入内存时,也载入了程序中的字符串。字符串存储在静态存储区中,但是,程序在开始运行时才会为该数组分配内存。此时才将字符串拷贝到数组中,此时字符串有两份,一个是在静态内存中的字符串字面量,另一个是存储在 a[ ] 数组中的字符串。
文字有点晦涩,我们结合图看看

指针形式( *b )也使得编译器为字符串在静态存储区预留14个元素的空间。一旦开始执行程序,它会把字符串地址存储在指针变量中。该变量指向该字符串的首字符。

其实不用关心太多,你只要知道,初始化数组把静态存储区的字符串拷贝到数组中,你的数组得到的只是它的副本,而初始化指针只把字符串的地址拷贝给指针,你得的是静态存储区字符串的地址。
数组和指针的选择:

那么我们用数组还是用指针呢?它们一个存着地址一个存着副本,所以肯定是有差别的对吧,我们精简的了解一下,因为书上真的很复杂写了一大堆的例子,我们提取一下精华:
字符串字面量是 const 的数据(常量),由于 *b 指向这个 const 数据,所以实际上 b 是 const char * b ,但是由于历史的原因,编译器接受不带 const 的写法,这意味这不能用 b 改变它指向的数据,但是仍然可以改变 b 的值,就是让 b 指向别的位置。如果把一个字符串字面量拷贝给一个数组,就可以随意改变数据,除非把数组声明为 const,数组元素是变量,但是数组名不是变量。
#include<stdio.h>
int main(void)
{
char a[]="hello world !"; //数组
a[0]='H';
printf("a[]=%s\n",a);

char* b="hello world !"; //指针
b[0]='H';
printf("*s=%s\n",b);

return 0;

}

我用的是 Dev -C++ ,在我电脑上编译它过了,但是这个指针形式并没有输出,这就很好的证明了上面说的对吧,你用指针你不能修改字符串字面量(字符串常量),因为你的指针是 const char *,所以你可以在把指针初始化为字符串字面量时使用 const 限定符:const char * b,书上推荐我们这样用,这也是比较安全的做法,看见 const 我们就知道不能去修改它。总之,初始化数组把静态存储区的字符串拷贝到数组中,而初始化指针只把字符串的地址拷贝给指针,如何选择取决于你想用程序做什么,如果你要去构造一个字符串数组,如果你要处理一个字符串指针。
补充

再说一下指针,就是当你用多个指针初始化的字符串字面量是一样的,它们得到的是同一个地址,编译器可以使用内存中的一个副本表示所以完全相同的字符串字面量。
#include<stdio.h>
int main(void)
{
char* a="hello world !";
char* b="hello world !";
char* c="hello world !";

printf("a= %p\n",a);
printf("b= %p\n",b);
printf("c= %p\n",a);

return 0;

}

你看它们的地址是不是一模一样

所以你有没有懂懂一点点这个(你初始化指针是 const ),如果允许你修改的话:
char* a="hello world !";
char* b="hello world !";
char* c="hello world !";

printf("a= %p\n",a);
a[0]='y';
printf("b= %p\n",b);
printf("c= %p\n",a);
那后面两个输出都变成“ yello world ”,如果编译器使用这种单次副本表示法,并允许 a[ 0 ] 修改 ‘ h ’,那将影响所有使用该字符串的代码。而把数组初始化为字符串字面量却不会导致类似问题,因为数组获得的原始字符串的副本。总之,如果你打算修改字符串,就不要用指针去初始化。

可以使用C语言中的rand()函数生成随机数,将生成的随机数对关键词数组和颜表情数组进行下标索引,从而实现关键词和颜表情的随机匹配替换。
以下是一个简单的实现示例:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
int main() {
srand(time(NULL)); // 设置随机数种子
char* keywords[] = {"am", "b", "tdm"}; // 关键词数组
char* expressions[] = {"˚*̥(∗*⁰͈꒨⁰͈)*̥哇哦~", "(♡ര‿ര)给我康康", "ʕ•̀ω•́ʔ✧"}; // 颜表情数组
int num_keywords = sizeof(keywords) / sizeof(keywords[0]); // 关键词数组长度
int num_expressions = sizeof(expressions) / sizeof(expressions[0]); // 颜表情数组长度
char sentence[1000] = "am is b, tdm is b too."; // 要处理的句子
char* p = sentence; // 句子指针
while (*p != '\0') {
int index = -1;
if (*p >= 'a' && *p <= 'z') { // 如果当前字符是小写字母
char word[100] = {0};
int i = 0;
while (*p != ' ' && *p != '\0') { // 找到关键词
word[i++] = *p++;
}
for (int j = 0; j < num_keywords; j++) { // 在关键词数组中查找匹配
if (strcmp(keywords[j], word) == 0) {
index = j;
break;
}
}
if (index != -1) { // 如果匹配到关键词
int expr_index = rand() % num_expressions; // 生成随机数
printf("%s", expressions[expr_index]); // 输出对应的颜表情
continue;
}
}
printf("%c", *p++); // 如果当前字符不是关键词,直接输出
}
return 0;
}
在上述示例中,首先定义了关键词数组和颜表情数组,然后使用rand()函数生成随机数,在句子中查找关键词,如果匹配到关键词,则根据生成的随机数输出对应的颜表情,否则直接输出当前字符。

以下是一个简单的C++程序,用于实现任意关键词随机替换颜表情:
```

#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <cstdlib>
#include <ctime>
using namespace std;

int main()

{
// 定义关键词和颜表情
vector<string> keywords = {"am", "b", "tdm"};
vector<string> emojis = {"˚*̥(∗*⁰͈꒨⁰͈)*̥哇哦~", "(♡ര‿ര)给我康康", "(人 •͈ᴗ•͈) (୨୧•͈ᴗ•͈)◞ᵗʱᵃᵑᵏઽ*♡"};
// 创建关键词到颜表情的映射
map<string, string> keywordToEmoji;
for (int i = 0; i < keywords.size(); ++i) {
keywordToEmoji[keywords[i]] = emojis[i];
}
// 读取输入字符串
string input;
getline(cin, input);
// 替换关键词为随机颜表情
string output;
string delimiter = " ";
size_t pos = 0;
string token;
while ((pos = input.find(delimiter)) != string::npos) {
token = input.substr(0, pos);
if (keywordToEmoji.find(token) != keywordToEmoji.end()) {
output += keywordToEmoji[token] + " ";
} else {
output += token + " ";
}
input.erase(0, pos + delimiter.length());
}
if (keywordToEmoji.find(input) != keywordToEmoji.end()) {
output += keywordToEmoji[input];
} else {
output += input;
}
// 输出结果
cout << output << endl;
return 0;
}
```
这个程序首先定义了关键词和颜表情的向量,然后创建了一个关键词到颜表情的映射。接着,程序读取输入字符串,并根据空格分隔输入字符串,查找关键词并将其替换为随机颜表情。最后,程序输出替换后的字符串。

在程序中,我们使用了C++的STL库中的vector、map和string类来实现操作。在实现随机替换的功能时,我们使用了C++的随机数生成函数srand()和rand()来随机选择颜表情。


C语言字符串问题
1. 字符串初始化,如果逐个赋值的话,系统不一定会自动添加'\\0',除非指定了长度且指定的长度大于等于你赋值的字符的个数加1,即最小为你赋值的字符个数加1。假设你指定的字符个数为n,长度为len,则系统会将剩下的(len-n)个元素都赋值为'\\0',当n等于len时,不会添加任何'\\0'。之所以出现...

C语言问题:将字符串a复制到字符串b中
1、首先需要建立一个新的文件,输入头文件和主函数。2、接下来需要定义变量类型。3、设置完变量类型之后开始调用cpy函数。4、接下来需要定义一个函数,并定义变量类型。5、最后加一个字符串结束符,并在主函数中输出。6、编译。运行,可以看到字符串a复制到字符串b中。

c语言字符串结尾的问题?
!='\\0'.就是运行到字符串结尾时结束。!的意思是非,亦可以理解成不。‘\\0’是字符串的结束符号,由编译器自动加上。比如说,把一个字符串赋值给数组:u8 str1[]={"cxjr.21ic.org"};实际上数组str1在内存中的实际存放情况为: c x j r . 2 1 i c . o r g '\\0' 这后面的'\\0...

C语言问题:一个二维字符数组a[M][N],存储每个字符串的长度至多为()?
可看作M行N列,即M个存储空间为N的字符串 对于一个二维字符数组a[M][N],存储每个字符串的长度至多为(N-1)因为C字符串结尾必须留出一字节空间存储'\\0'对于一个长度为n的字符串,保存它至少需要占用的存储字节数为(n+1)原因同上,结尾需要额外一字节空间存储'\\0'

C语言字符串问题,求正确答案和解释 假设已定义char a[10]和char *p=a...
正确答案是D A错误,因为a[10]代表一个字符是吧,不能赋值字符串 B错误是因为 数组名不能当左值,也就是数组名不能被赋值 C和A同样的错误,*p代表的是a[0]D是正确的给指针赋值字符串是可以的

c语言字符串提取与合成问题?
一、两个指针分别指向数组第一项和第二项,对应偶数项和奇数项,之后指针同时循环+2取值保存在对应数组。二、拼接字符串直接使用字符串函数strcat。(不想使用库函数,也可循环赋值)。include <stdio.h> include <string.h> define M 20 \/\/数组最大长度 int splitStr(char str[],char oStr[],...

C语言问题:写一个函数,将一个字符串中的元音字母复制到另一字符串后面...
void output(char st[]);\/\/定义输出函数 void letter(char x[],char y[]);\/\/定义元音复制函数 int main(){ char s1[20],s2[10];input(s1);\/\/调用输入函数 letter(s1,s2);\/\/调用元音复制函数 output(s2);\/\/调用输出函数 return 0;} \/\/输入函数 void input(char st[]){ printf("...

呵呵,问一个C语言里字符串长度的问题。
1 表示字符 1 \\

关于C语言字符串的问题求助
其中有一个转义字符'\\0',它是字符串结束符,所以,当用函数strlen来测试该字符串的长度时,结果应该为5 \\t\\018\\\\\\"12 当遇到转义字符'\\0'时,还要看其后面是否还有数字,若有,则应将后面的数字(一至二位)与前面的'\\0'相结合作为一个字符计入整个字符串的长度。0807\\07\\08可以拆成0 8...

关于C语言字符串数组输入问题?
这当然不行啊,char *a[11];表示定义了11个字符型指针,每个指针还没有指向有存储空间的内存地址。如果想要能运行需要申请内存加上 a[0]=(char*)malloc(100);

晋中市15936213912: 一个C语言字符串输入问题 -
方敬脂肪: 我也试了一下,没问题,你到底是什么问题,是要在s1或s2中输入空格吗?那么用gets函数;gets()函数用来从标准输入设备(键盘)读取字符串直到换行符结束,但换行符会被丢弃,然后在末尾添加'\0'字符. 其调用格式为:gets(s);其...

晋中市15936213912: c语言中字符串是什么东西 -
方敬脂肪: 正解:在c语言中, 由零个或多个字符组成且通过双引号括起来的有限序列就叫字符串.例如:"hello world", "我爱中国", "A", "123456"等等.另外字符串在内存中是由字符型数组来存储的.且在存储的时候多加'\0'表示字符串已经结束.例如:char string[12] = "hello wolrd";注意,字符串是以'\0'结尾的,所以存储的数组大小至少是字符串长度加1.

晋中市15936213912: c语言字符串问题 -
方敬脂肪: #include int main(void) { int flag = 0; char s[128]; gets(s); if (strstr(s, ".sch") != NULL) { flag = 1; } else { flag = 0; } printf("%d\n", flag); return 0; }

晋中市15936213912: c语言关于字符串的问题,新手求教 -
方敬脂肪: strcmp这个函数比较两个字符串大小,是按字符的ansii码进行比较的.strcmp(str1,str2),对str1和str2的每个字符进行比较,如果str1>str2,则strcmp的返回值大于0,反之返回值小于0.所以当楼主输入的str2是小写字符串是,那么str1是恒小于str2的,输出的永远是str2接在str1后面.另外如果输入大写字符串str2,当str2的首字符ascii码值大于H的ascii值时,(或者str2前几个字符于str1都相同,直到不同的字符出现,并且大于str1中相同位置的字符ascii值时),输出的也是str2接在str1后面了,楼主可以试试就知道了.

晋中市15936213912: C语言字符串问题
方敬脂肪: for( i=0; i<strlen(strInput); i++ ) { printf( "%c ", strInput[i] ); } printf( "\n" );

晋中市15936213912: 问一个C语言字符串的问题
方敬脂肪: 以行为单位依次把字符串中所有小写字母o左边的字符串内容移到该串的右边存放.这句话的意思: 例:ashduinhgohhjsmngg 变为:ohhjsmnggashduinhg

晋中市15936213912: c语言中关于字符串的问题 -
方敬脂肪: 输入输出是单字符的就用单引号,是数组或者二维表的时候就为双引号!

晋中市15936213912: 数据结构(C语言)中字符串的问题 -
方敬脂肪: 空串 :里面是空 为NULL 空格串:里面是一个" " ASCLL=32 定义空串 : string a="";“空串”是无法输入,但可以使一串为空串 a="";

晋中市15936213912: 一道C语言中字符串的简单问题~ -
方敬脂肪: #include"stdio.h"#include"string.h" void main() { int j,k,i=0; char ch[20],str[80],ss[20]; printf("enter "); scanf("%s %s",ch,str); while(ch[i++]);i=i-1;printf(" %d ",i); for(j=0;str[j+i];j++) {for(k=0;k<i;k++)ss[k]=str[j+k]; ss[k]='\0'; if( strcmp(ss,ch)==0 )break;} printf(" %d ",j); }

晋中市15936213912: C语言中什么是“字符”、“字符串”?有什么区别? -
方敬脂肪: 1. 类型不同字符char, 字符串char * 2. 操作不同char 可以+ - * / % >> << 等char *不能+ * / << >> 等,-运算结果不是char *,而是int 3. sizeof(char)=1; sizeof(char*)在32位系统里面=4,16位系统里=2

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网