c - 将字符串复制到时出现段错误

标签 c pointers gcc fault strcpy

打那里!

下面是我今天做的一个小程序。它需要一个字符串表,在不反转表的情况下反转所有字符串,然后对这些反转的字符串进行排序,然后反转它们,最后打印整个表。

我花了很长时间想弄清楚为什么我不能将“slowo”字符串复制到 strcmp 指向的表中,但没有成功。如果有人能在这种情况下找到修复段错误的方法,我会很高兴,但我真的想保留下面的方法。

感谢您的帮助! :)

编辑通过使用调试器,我确定段错误出现在 strcpy 中,如果不清楚的话......

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

const int ROZMIAR=4;
char* nieposortowane[]={"basia", "zosia", "ala", "genowefa"};

int porownaj(char* a, char* b)
{
return strcmp(a,b);
}

void sortowanie(char** tablica, int N)
{
int zamienione, i;
char tmp;

do
{
    zamienione=0; 
    for(i=0;i<N-1;i++)
        if(porownaj(nieposortowane[i], nieposortowane[i+1])>0)
        {

            tmp=**(tablica+i);
            **(tablica+i)=**(tablica+(i+1));
            **(tablica+(i+1))=tmp;

            zamienione=1;
        }
}
while(zamienione);
}

void wypisz(char** tablica, int N)
{
int i=0;
for(i=0;i<N;i++)
    printf("%s\n", *(tablica+i));
}

void odwr(char** tablica, int N)
{
int i, ln, c;
int start, koniec;
char temp;

for(i=0;i<N;i++)
{
    ln = strlen(tablica[i]);
    char slowo[ln];
    strcpy(slowo,*(tablica+i));
    start=0;
    koniec=ln-1;
    for(c=0;c<(ln/2);c++)
    {
        temp =slowo[start];
        slowo[start]=slowo[koniec];
        slowo[koniec]=temp;
        start++;
        koniec--;
    }
    strcpy(*(tablica+i), slowo);
}
}

int main()
{
printf("Przed sortowaniem: \n");
wypisz(nieposortowane, ROZMIAR);

odwr(nieposortowane, ROZMIAR);
sortowanie(nieposortowane, ROZMIAR);
odwr(nieposortowane, ROZMIAR);

printf("Po sortowaniu babelkowym: \n");
wypisz(nieposortowane, ROZMIAR);

return 0;
}

最佳答案

分配slowo时,在计算要分配的大小时,应该将strlen的结果加1。这是为了容纳终止空字符,它不包含在字符串的 length 中(由 strlen 返回),但必须包含在其分配的总大小中。

关于c - 将字符串复制到时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20133574/

相关文章:

c - 指针可以指向未分配的内存吗?

c - 如何在 c 套接字中使用 select 等待特定响应而不忽略其他响应?

c - 如何在 C 中打印文件描述符中的信息。

c - OpenGL:每个图元的顶点属性数组?

c - 为什么 *pp[0] 等于 **pp

c++ - 当我编译指令 __atomic_add_fetch 时到底发生了什么

gcc - 我可以确定用于创建仅二进制共享库的编译器/链接器标志吗?

c - 通过函数操作变长二维数组

c - 代码是否自上而下阅读

python - libao 示例在编译为 python 模块时不起作用