在对字符串做一些程序时,我遇到了这个小问题。 问我的问题是这个 - 编写strcat(s,t)函数的指针版本,将字符串t复制到s的末尾。 我把这个程序写成了这个 -
#include<stdio.h>
void strcat(char *s, char *t);
int main()
{
char *s1, *s2;
printf("enter the first string\n");
scanf("%s",s1);
printf("Enter the second string\n");
scanf("%s",s2);
strcat(s1,s2);
printf("Strings concatenated\n");
printf("%s",s1);
return 0;
}
void strcat(char *s, char *t)
{
while(*s++)
;
while(*s++ = *t++)
;
}
我知道我做过某些事情(或许多事情)非常错误。因为无论何时我尝试运行此代码 - 它都会给我分段错误。像这样 -
输入第一个字符串
您好
输入第二个字符串
分段错误(核心转储)
如果有人指出我实施的缺陷/缺陷,那将会非常有帮助。提前谢谢。
非常感谢你们,这些快速反应。但似乎这不是唯一的问题。写完这样的程序后 -
#include<stdio.h>
void strcat(char *s, char *t);
int main()
{
char s1[20], s2[20];
printf("enter the first string\n");
scanf("%s",s1);
printf("Enter the second string\n");
scanf("%s",s2);
strcat(s1,s2);
printf("Strings concatenated\n");
printf("%s",s1);
return 0;
}
void strcat(char *s, char *t)
{
while(*s++)
;
while(*s++ = *t++)
;
}
它像这样运行。
输入第一个字符串
您好
输入第二个字符串
有
您好
它只打印我输入的第一个字符串。现在我觉得我在strcat函数上也犯了一些错误。
答案 0 :(得分:11)
1)在main()
中,您必须为s1
和s2
指针分配内存
char *s1=malloc(100*sizeof(char)), *s2=malloc(100*sizeof(char));
scanf("%99s",s1); //the "%99s" allow to avoid buffer overflow
如果您使用gcc和gcc&gt; 2.7,那么您可以通过这种方式在scanf()
中使用“%ms”:
scanf("%ms",&s1);
使用"%ms"
,scanf()
将为s1
指针分配内存
2)您必须在
中添加s--
while(*s++)
;
s--; // add s-- here
while(*s++ = *t++)
;
因为s指针指向'\0'
元素的下一个元素。在开始复制第二个字符串
'\0'
元素中指向s指针
答案 1 :(得分:7)
您没有为s1
,s1
分配内存(或使用数组初始化),s1
,s1
的值都是垃圾。
char *s1, *s2;
printf("enter the first string\n");
scanf("%s",s1);
这会导致未定义的行为。
建议使用:
#define SIZE 1024
char s1[SIZE], s2[SIZE];
或使用calloc()/ maloc()函数动态分配内存:
char *s1, *s2;
s1 = malloc(SIZE);
s2 = malloc(SIZE);
使用s1
,s2
完成工作时,最近明确释放()内存。
另外,使用scanf()
函数来代替不安全的fgets()
,以避免缓冲区溢出错误。阅读Reading a line using scanf()
not good?