中止陷阱:在MacOS上使用strcpy时为6英寸

时间:2016-12-15 04:23:17

标签: c string runtime-error strcpy

我正在处理一些代码,将一个字符串作为输入并将其反转。

当我输入一个字符串时,我得到一个"中止陷阱: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;
        }

3 个答案:

答案 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]);不是templine[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