Недопустимый инициализатор: strcat (s, str); в программе C

nisheethposhiya спросил: 12 мая 2018 в 04:31 в: c

Я пишу программу в hackerrank и пытаюсь конкатрировать две строки с помощью функции strcat(), но она не работает для меня.

Я студент и изучаю C-язык, вы можете помочь мне найти способ конкат двух строк.

Вот мой код:

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>int main() {
    int i = 4;
    double d = 4.0;
    char s[] = "HackerRank ";    // Declare second integer, double, and String variables.
    int j;
    double e;
    char str[] = "";    // Read and save an integer, double, and String to your variables.
    scanf("Enter integer : %d",&j);
    scanf("Enter double : %lf",&e);
    scanf("Enter string : %s",str);    // Print the sum of both integer variables on a new line.
    int sum = i + j;
    printf("\n %d",sum);    // Print the sum of the double variables on a new line.
    double doubleSum = d + e;
    printf("\n %lf",doubleSum);    // Concatenate and print the String variables on a new line
    char finalString[] = strcat(s,str);
    printf("%s",finalString);    // The 's' variable above should be printed first.
    return 0;
}

Ошибка:

solution.c: In function ‘main’:
solution.c:30:26: error: invalid initializer
     char finalString[] = strcat(s,str);
                          ^~~~~~

Ошибка компилятора


2 ответа

Есть решение
rahul mishra ответил: 12 мая 2018 в 05:15

Проверьте код ниже:

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>int main() {
    int i = 4;
    double d = 4.0;
    char s[] = "HackerRank ";
    char *finalString = NULL;
    int j;
    double e;
    char str[100];
    scanf("%d",&j);
    scanf("%lf",&e);
    scanf("%s", &str);
    int sum = i + j;
    printf("\n %d",sum);
    double doubleSum = d + e;
    printf("\n %lf",doubleSum);
    finalString = realloc(finalString, strlen(s) + strlen(str) + sizeof(char));
    strcat(finalString,s);
    printf("\n %s",finalString);    
    strcat(finalString,str);
    printf("\n %s \n",finalString);
   return 0;
}
Christian Gibbons ответил: 12 мая 2018 в 05:19
Пожалуйста, объясните свое решение, а не просто код сбрасывания.
Christian Gibbons ответил: 12 мая 2018 в 05:26
Для самого кода, почему вы используете realloc, а не malloc, когда перераспределение не выполняется? Кроме того, вместо последовательных вызовов strcat вы можете сохранить результаты strlen, которые будут использоваться в качестве смещения для strcpy, а не для перемещения по времени строки и время снова (это то, что strlen делает, чтобы получить длину, и strcat), чтобы найти конец строки).
nisheethposhiya ответил: 12 мая 2018 в 12:31
Ваш ответ работает в моем редакторе, но он не работает в Hackerrank. Я не знаю, какие варианты использования он рассматривает.
rahul mishra ответил: 12 мая 2018 в 01:30
в чем была ошибка?
nisheethposhiya ответил: 15 мая 2018 в 04:16
Я столкнулся с ошибкой из-за новой строки и исправил ее добавлением дополнительного scanf для сканирования новой строки. Благодарю.
rerun ответил: 12 мая 2018 в 04:40

strcat возвращает char, который является изменяемым указателем. Он не может использоваться как инициализация массива символов, потому что размер неизвестен во время компиляции.

Следует также отметить, что первый параметр, который вы передаете в strcat, является пунктом назначения, который изменяется вызов, и это то, что возвращается. Для этого вам нужно иметь достаточно большой буфер для хранения содержимого комбинированной строки.

NPE ответил: 12 мая 2018 в 04:43
Также можно отметить, что для почти любой входной строки код попадет в неопределенное поведение даже до перехода на strcat() (, если он попадет в strcat() :)) ,
nisheethposhiya ответил: 12 мая 2018 в 04:46
Спасибо, человек, я нахожу указатель, который трудно понять. Спасибо за вашу помощь. Можете ли вы предложить какой-то код для решения моей ошибки?
rerun ответил: 12 мая 2018 в 04:54
Взгляните на ссылку. Когда вы имеете дело со строками, вам нужно иметь достаточно места для хранения значения. Когда вы определяете массивы char, поскольку у вас есть компилятор, выделяется только то, что требуется для хранения литерала. У вас должно быть больше, так как любое обнаружение строки sscanf потребует больше места, чем пустая строка. Взгляните на ссылку, на которой вы можете увидеть, как они определяют, что char arrry является подсказкой. cplusplus.com/reference/cstdio/scanf