Почему программа останавливается, если я использую strcpy () для двух строк с одинаковым размером в C? - PullRequest
0 голосов
/ 16 апреля 2020

Я использую CodeBlocks для Windows в качестве своей IDE. В этой программе я пытаюсь скопировать две разные строки (строка [8] [0] со строкой [9] [0]), и я не могу, даже если они имеют одинаковую длину. Я не понимаю, почему программа не работает, потому что, когда я использовал в упражнении две разные строки одинаковой длины, программа работала.

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

int main()
{
    char* string[10][10];
    int i;
    string[8][0] = "ooo";
    string[9][0] = "uuu";
    puts(string[8][0]);
    puts(string[9][0]);
    printf("%d %d", strlen(string[8][0]), strlen(string[9][0]));//This line is just to make sure that both strings have the same lenght
    strcpy(string[8][0], string[9][0]);//I want to copy the content of the string "string[9][0]" to the string "string[8][0]" and replace what was on that string
    puts(string[8][0]);
    puts(string[9][0]);
    return 0;
}

Ответы [ 2 ]

2 голосов
/ 16 апреля 2020

Вы видите неопределенное поведение 1 . Почему? Поскольку строка string[8][0] = "ooo"; назначает указателю на string[8][0] адрес строкового литерала constant . Затем, когда вы позже вызываете strcpy(string[8][0], string[9][0]);, вы пытаетесь записать в эти константные данные.

«Быстрое исправление», чтобы заставить вашу программу работать, - скопировать строковый литерал в непостоянный массив символов, например:

int main()
{
    char* string[10][10];
    int i;
    //    string[8][0] = "ooo";
    char buffer[4] = "ooo"; // This line COPIES the literal into the non-const array
    string[8][0] = buffer;  // ... and here we give the pointer that array's address
    string[9][0] = "uuu";
    puts(string[8][0]);
    puts(string[9][0]); // Note, I've added a newline below to make the output tidier!
    printf("%d %d\n", strlen(string[8][0]), strlen(string[9][0]));//This line is just to make sure that both strings have the same lenght
    strcpy(string[8][0], string[9][0]);//I want to copy the content of the string "string[9][0]" to the string "string[8][0]" and replace what was on that string
    puts(string[8][0]);
    puts(string[9][0]);
    return 0;
}

1 Неопределенное поведение может вызвать любое количество вещей! На некоторых платформах программа может «игнорировать» вашу попытку перезаписать постоянные данные; на моей платформе происходит сбой программы (как на вашей).

0 голосов
/ 18 апреля 2020

относительно

string[8][0] = "ooo"; 

и подобных утверждений:

код копирует точку в постоянную память

И помните, что постоянная память не может быть изменена по программе.

Предложите изменить код, чтобы строки (строки) фактически помещались в массив, аналогично.

char string[10][10];
...
strcpy( string[0], "ooo" );

относительно:

printf("%d %d\n", strlen(string[8][0]), strlen(string[9][0]));  

функции: strlen() возвращает size_t, а не int, поэтому спецификаторы преобразования выходного формата должны быть %zu, а не %d

Если ваш компилятор не предупредил вас о проблемах в коде, то включите предупреждения, затем исправьте эти предупреждения.

Для gcc при минимальном использовании: -Wall -Wextra -Wconversion -pedantic -std=gnu11

Обратите внимание, что другие компиляторы используют разные параметры для получения одинаковых результатов

...