一个会立刻报错的程序代码
#include <stdio.h>
#include <string.h>
int main(void)
{
char string[10]="123456";
char *str1 ="abcdefghij";
printf("string.length=%d\n",strlen(string));
strcat(string,str1);
printf("string.length=%d\n",strlen(string));
printf("string=%s\n", string);
printf("str1=%s\n",str1);
return 0;
}
但如果将string[10]改为string[20],则正常运行如下:
string.length=6
string.length=16
string=123456abcdefghij
str1=abcdefghij
这就说明个道理:也许
在strcat(str1,str2)中,str1被定义时的长度必须不小于str1+str2的长度!
反过来做一个实验,将一个字符串数组中的值与一个字符指针相连接:
#include <stdio.h>
#include <string.h>
int main(void)
{
char string[20]="123456";
char *str1 ="abcdefghij";
printf("str1.length=%d\n",strlen(str1));
strcat(str1,string);
printf("str1.length=%d\n",strlen(str1));
printf("string=%s\n", string);
printf("str1=%s\n",str1);
}
str1.length=10
str1.length=16
string=123456
str1=abcdefghij123456
奇怪,为什么一切正常?
这时,可以猜想strcat(str1,str2)可能要分2中情况:
1.当str1为字符数组时,道理同第一个实验
2.当str1为字符串指针时,则str1无需大于str1+str2的长度,因为str1是指针,指针里存储的是地址!
但是仔细想一下,
c语言里面有个经典的经验是,如果你以指针方式定义了一个字符串
char *p="12345678"
那么这个就不能用p[2]=3;这样类似的语句来修改*p中的值,否则会出现内存污染。当然几行的代码中是看不出来的。
引用
数组和指针都可以在它们的定义中用字符串常量进行初始化。尽管看上去一样,底层的机制却不想同。
定义指针时,编译器并不为指针所指向的对象分配空间,它只是分配指针本身的空间,除非在定义时同时赋给指针一个字符串常量进行初始化。例如,下面的定义创建了一个字符串常量(为其分配了内存):
char *p="breadfruit";
注意只有对字符串常量才是如此。不能指望为浮点数之类的常量分配空间,如:
float *pip=3.141; /*错误!无法通过编译*/
在ANSI C中,初始化指针时所创建的字符串常量被定义为只读。如果试图通过指针修改这个字符串的值,程序就会出现未定义的行为。在有些编译器中,字符串常量被存放在只允许读取的文本段中,以防止它被修改。
数组也可以用字符串常量进行初始化:
char a[]="gooseberry";
与指针相反,由字符串常量初始化的数组是可以修改的。其中的单个字符在以后可以改变,比如下面的语句:
strncpy(a,"black",5);
就将数组的值修改为"blackberry"。
摘录自《C 专家编程》
就我们前面的经验,我们可以将代码修改如下,立刻发现其中的问题:
#include <stdio.h>
#include <string.h>
int main(void)
{
char string[50]="12345678901234567890123456789012345678901234567890";
char *str1 ="abcdefghijabcdefghijabcdefghijabcdefghijabcdefghij";
printf("str1.length=%d\n",strlen(str1));
strcat(str1,string);
printf("\nstr1.length=%d\n",strlen(str1));
return 0;
}
在我的机器上,立刻程序崩溃!
再做一个实验,定义2个字符串数组,str1和str2,将他们连接后,改变str2的值,看是否影响str1。
#include <stdio.h>
#include <string.h>
int main(void)
{
char str1[50]="12345678901234567890";
char str2[50]="12345678901234567890";
printf("str1.length=%d\n",strlen(str1));
strcat(str1,str2);
printf("\nstr1.length=%d\n",strlen(str1));
str2[0]='A';
printf("\nstr1=%s",str1);
printf("\nstr2=%s",str2);
return 0;
}
str1.length=20
str1.length=40
str1=1234567890123456789012345678901234567890
str2=A2345678901234567890
结论是:不影响!
结合以上种种迹象表明:
strcat(str1,str2)中的str1必须为一字符串数组,或者指向字符串数组的指针,而且字符数组的长度要足够大。strcat就是将str2中的值拷贝到str1中,接在str1中现有字符的后面!
现在清楚了,strcat到底发生了什么事情了! 如下面这个例子:
#include <stdio.h>
#include <string.h>
int main(void)
{
char string[101]="12345678901234567890123456789012345678901234567890";
char *str1 ="abcdefghijabcdefghijabcdefghijabcdefghijabcdefghij";
char *str2;
str2=string;
strcat(str2,str1);
printf("str2.length=%d",strlen(str2));
printf("\n str2=%s",str2);
return 0;
}
str2.length=100
str2=12345678901234567890123456789012345678901234567890abcdefghijabcdefghijabcd
efghijabcdefghijabcdefghij
注意:string[101]而不是string[100] 因为字符串处理时,最后要加上字符串结束符。当string[100]来执行上面这个程序,就会报错,程序不能输出str2.length和str2的值。
分享到:
相关推荐
字符串连接就是将一个字符串连接到另一个字符串的末尾,使其组合成一个新的字符串,在字符串处理函数中,strcat 函数具有字符串连接功能。下面是用C语言实现不使用是strcat 函数实现连接两个字符串的功能。 源代码:...
c 字符串拼接字符串拼接strcat使用及实现
strcat 函数的功能是字符串拼接函数。它的用法是 `char *strcat(char *destin, char *source);`,其中 `destin` 是目标字符串,`source` 是源字符串。例如: ```c #include #include int main(void) { char ...
c 字符串拼接C语言 strcat() 函数用来将两个字符串连接(拼接)起来。头文件:string.h语法/原型:char*strcat(char* strDestination, const char* strSource);参数说明:•strDestination:目的字符串;•strSource...
3. 字符串连接:strcat()和strncat()函数用于连接两个字符串,理解它们的区别和使用场景,以及注意防止溢出。 4. 字符串查找:strchr()和strstr()函数分别用于查找字符和子字符串在字符串中的位置。 5. 字符串长度...
strcat函数实现将一个字符串追加到另一个字符串的末尾,并返回目标字符串的指针。strcpy函数则实现将源字符串复制到目标字符串的指定内存位置,并返回目标字符串的指针。strncat和strncpy是strcat和strcpy的变体,...
例如,`strcat()` 和 `strncat()` 可以用来连接两个或多个字符串,`strstr()` 可以查找子字符串在主字符串中的位置,`strchr()` 和 `strrchr()` 则分别用于查找字符在字符串中的首次出现和最后一次出现。 此外,...
字符串连接是通过操作符`+`或者`strcat`函数将数值和字符串拼接在一起。例如,假设我们有一个变量`num = 42`,我们可以创建一个包含该数值的字符串如下: ```matlab num = 42; str = ['The answer is ', num2str...
15. strcat:连接两个字符串,将第二个字符串追加到第一个字符串的末尾。 16. strchr:查找字符串中第一个出现的指定字符,返回指向该字符的指针。 17. strcmp:比较两个字符串,根据字典顺序返回它们的相对关系。...
3. `strcat`用于连接字符串,如`strcat('hello', 'world')`会得到`'helloworld'`。 4. `strrep`用于替换字符串中的子串,如`strrep('MATLAB', 'LAB', 'XYZ')`将得到`'MXYZ'`。 5. `strcmp`和`strcmpi`用于比较字符串...
例如,`strcat()`函数用于连接两个字符串,`strstr()`函数用于查找子串的位置,`strcpy()`用于复制字符串。 3. **字符串处理算法**:一些经典算法如KMP(Knuth-Morris-Pratt)算法用于高效的子串匹配,Rabin-Karp...
使用 `strcat()` 时,确保目标字符串有足够的空间容纳附加的字符串,否则可能导致内存溢出。 4. **sprintf()**:这个函数可以将数值转换为字符串格式,并将其写入到指定的字符数组中。在示例中,`tag` 的值被转换成...
这里需要使用字符串函数,如`strcpy`、`strcat`等。下面是一个例子: ```c char arr[20]; scanf("%s", arr); // 从用户输入读取字符串 // 或者 fscanf(stdin, "%s", arr); // 从标准输入流读取字符串 // 现在arr是...
这种方法的关键在于`strncpy()`函数,它用于复制指定长度的字符串,而`strcat()`函数用于连接两个字符串。 ### 方法三:使用`memcpy()`函数 `memcpy()`函数用于内存块的拷贝,我们可以用它来实现字符串的右移。与`...
c语言不使用strcat函数连接两个字符串(适合大学生,c语言初学者)
连接字符串可以使用strcat函数,该函数的实现方法如下: ```c char *strcat(char *s,char *s1){ int i,j; for(i=0;i(s);i++); for(j=i;j;j++) *(s+j)=*(s1+j-i); return s; } ``` 这个函数使用了指针操作,将源...
在C语言中,通常使用 `strcat` 和 `strstr` 进行字符串连接和子串查找。而在VB中,则没有直接提供这些功能。为了实现类似的功能,可以考虑使用下面的方法: - **字符串连接**:可以使用 `&` 或 `+` 运算符来连接...
在C语言中,连接两个字符串是常见的编程需求之一。通常,我们可以通过使用标准库中的`strcat`函数来实现这一功能。该函数位于`string.h`头文件中,并提供了简单而有效的方法来合并两个字符串。 #### 示例代码解析 ...
修改C风格字符串需要使用如`strcpy`、`strcat`等函数,而`std::string`支持直接赋值和拼接操作。 - **安全性与灵活性** `std::string`提供了更安全的内存管理,防止了缓冲区溢出的风险,并且能够动态地调整字符...