Есть ряд вопросов.Во-первых, это.
while (*user1p) {
*user2p = *user1p;
*user2p++;
*user1p++;
}
Это работает случайно.Если у вас есть предупреждения компилятора, вы должны получить предупреждение ...
test.c:13:9: warning: expression result unused [-Wunused-value]
*user2p++;
^~~~~
test.c:14:9: warning: expression result unused [-Wunused-value]
*user1p++;
^~~~~~~
Причина, по которой он не используется, заключается в том, что C интерпретирует его так:
*(user1p++)
Увеличьте указатель, затемразыменовывать это.Вы просто хотите увеличивать указатели, разыменование не требуется.
while (*user1p) {
*user2p = *user1p;
user2p++;
user1p++;
}
Затем здесь.
printf("String 2 after concatenation: %c\n", strconcat(user2p, user1p));
%c
печатает человека char
.Вы хотите %s
, который печатает char *
.Это показывает, что у вас неправильная подпись.strconcat
должен вернуть char *
(то есть то, что C использует для строк) и вернуть user2p
(char *
).
char *strconcat(char *orig_to, const char *from) {
...
return user2p;
}
И так как вы не меняете from
, то этодолжно быть const char *
, чтобы сообщить компилятору и предупредить вас, если он случайно изменился.
Наконец, когда вы возвращаете *user2p
, он уже перемещен в конец строки.
while (*user1p) {
*user2p = *user1p;
user2p++;
user1p++;
}
*user2p = '\0';
printf("test: %c", *user2p);
// This points to the null byte just set above
return user2p;
Таким образом, печать результата strconcat
ничего не напечатает.Чтобы обойти это, сохраните исходный указатель для user2p
и верните его.
char *strconcat(char *orig_to, const char *from) {
char *orig_user2p = user2p;
...
return orig_user2p;
}
И некоторые советы.Проще следовать коду с хорошими именами переменных, которые описывают то, что они делают.
char *strconcat(char *orig_to, const char *from) {
char *to = orig_to;
...
}
char foo[NN]
уже делает foo
указателем.Нет необходимости объявлять отдельные переменные char *
и копировать указатель.
char from[21], to[21];
Никогда не используйте gets
.Нет предела тому, сколько памяти он может использовать, и он может легко переполнить ваш буфер.Используйте fgets
, который может ограничить объем считываемой информации в доступной памяти.
printf("Please enter the string to concat from: ");
fgets(from, sizeof(from), stdin);
Хотя досадно, что он сохраняет символ новой строки, и нет простой функции для его удаления.Вы можете использовать scanf
, который удалит пробелы, но остерегайтесь его многочисленных ловушек .
printf("Please enter the string to concat from: ");
scanf("%20s", from);
printf("Please enter the string to concat to: ");
scanf("%20s", to);
Наконец, убедитесь, что строка, к которой вы объединяетесь, может содержать свое собственное содержимое иновое содержание.
char from[21], to[41];
printf("Please enter the string to concat to: ");
// Be sure to leave enough room in `to` to fit `from`.
fgets(to, sizeof(to) - sizeof(from), stdin);