我正在处理一些代码,将一个字符串作为输入并将其反转。
当我输入一个字符串时,我得到一个"中止陷阱:6"错误。我认为问题在于我使用(滥用?)strcpy,但GDB没有帮助,关于此错误和strcpy的其他问题没有帮助我理解为什么我收到此错误。
我在代码中添加了一些注释,说明了预期的功能。
感谢您提供任何帮助或阅读材料!
#include <stdio.h>
#include <string.h>
int main()
{
char line[1024];
fgets(line,sizeof(line),stdin);
int size = strlen(line);
for(int I = 0; I <size-I;I++)
{
char temp;
int relative_size = size-I;
strcpy(&temp,&line[I]);//??copies Ith character of line to temp??
strcpy(&line[I],&line[relative_size]); //??swaps characters at [I] and [size-I]??
strcpy(&line[relative_size],&temp);
}
printf("%s", line);
return 0;
}
答案 0 :(得分:3)
strcpy不会单独复制字符。它复制字符串。字符串是字符数,后跟\ 0终止字符。
strcpy(&temp,&line[I]);
以上strcpy尝试复制从第I个字符开始直到结束(到达第一个\ 0)到由&amp; temp指定的地址的字符串。因为temp是单个char变量,实际上你正在经纪你的堆栈框架并意外地将其写入其他变量。
你应该使用这样的东西来获得我的角色
temp = line[I];
答案 1 :(得分:2)
strcpy()
不会复制单个字符,而是复制以0结尾的字符串。因此,如果strcpy(&temp, &line[i]);
不是temp
,line[I]
是“缓冲区溢出”(\0
实际上不是缓冲区)。要复制单个字符,只需指定它:
temp = line[I];
这也适用于以下两个陈述。
答案 2 :(得分:0)
要反转字符串,您需要交换字符串中不包括终止零的字符对。
标准C函数strcpy
旨在复制字符串。例如,如果变量line
包含字符串"abcd"
且变量I
等于零,那么此语句
strcpy(&temp,&line[I]);
等同于此声明
strcpy(&temp,&line[0]);
并尝试将整个字符串复制到仅从一个字节分配的内存中,如声明中所示
char temp;
结果,变量temp
之外的内存将被覆盖,从而导致程序的未定义行为。
因此,您应该分配单独的字符,而不是使用该功能。
循环可以采用以下方式
size_t size = strlen(line);
for (size_t i = 0; i < size - i; i++)
{
char temp = line[i];
line[i] = line[size - i - 1];
line[size - i - 1] = temp;
}
考虑到函数fgets
如果有足够的内存,则将字符串数终止为零。您应该在反转之前将其从字符串中删除。它可以通过以下方式完成。
fgets(line,sizeof(line),stdin);
line[ strcspn( line, "\n" ) ] = '\0';
size_t size = strlen(line);
标准函数strlen
也有返回类型size_t
。因此,最好将此类型用于变量size
,而不是类型int
。