Я создал программу, которая получает от 2 до 5 строк и объединяет все вместе, используя функцию переменных аргументов.Объединение строк с использованием функции переменных аргументов
Пока программа работает нормально, но она всегда показывает в конце 3 случайных символа перед показом полной строки.
Например:
Please insert number of strings: 3
string 1: car
string 2: bike
string 3: plane
Полная строка:
=$>carbikeplane
Я сделал несколько настроек в программе, пытаясь найти причину и устранить ее, но я всегда получаю тот же результат.
Полная программа показана ниже. Несколько комментариев о программе:
- Я печать строк в разных частях программы, потому что я пытался найти, где эта проблема придет. Поэтому некоторые функции printf() могут не иметь смысла.
- Основная функция кажется прекрасной, проблема в функции, определенной позже.
ПРИМЕЧАНИЕ: Я все еще изучаю C, поэтому может быть какой-то код, который может/может создавать неопределенное поведение, если есть, я был бы признателен, если вы можете указать их.
#include <stdio.h>
#include <string.h>
#include <stdarg.h>
char *function(int num, ...);
int main(void)
{
char line1[80] = " ", line2[80] = " ", line3[80] = " ", line4[80] = " ", line5[80] = " ";
int count = 0, count2;
char *newStr;
int i;
int status;
do {
fflush(stdin);
printf("\nPlease select the number of strings (max. 5): ");
scanf("%d", &count);
}while(count < 2 && count > 5);
count2 = count;
fflush(stdin);
status = 1;
for(i = 1 ; count > 0; count--, i++)
{
switch(status)
{
case 1:
{
printf("\nInput string[%d]: ", i);
gets(line1);
status = 2;
break;
}
case 2:
{
printf("\nInput string[%d]: ", i);
gets(line2);
status = 3;
break;
}
case 3:
{
printf("\nInput string[%d]: ", i);
gets(line3);
status = 4;
break;
}
case 4:
{
printf("\nInput string[%d]: ", i);
gets(line4);
status = 5;
break;
}
case 5:
{
printf("\nInput string[%d]: ", i);
gets(line5);
status = 6;
break;
}
}
}
printf("\n%s\n%s\n%s\n%s\n%s\n", line1, line2, line3, line4, line5);
/*call the function of variable arguments*/
/*memory allocation of newstr*/
newStr = (char *)malloc(420*sizeof(char) +1);
switch(count2)
{
case 2:
{
newStr = function(2, line1, line2);
break;
}
case 3:
{
newStr = function(3, line1, line2, line3);
break;
}
case 4:
{
newStr = function(4, line1, line2, line3, line4);
break;
}
case 5:
{
newStr = function(5, line1, line2, line3, line4, line5);
}
}
printf("\nThe final string is: \n");
printf("%s", newStr);
return 0;
}
char *function(int num, ...)
{
va_list arg_ptr;
int b;
char *string;
char *curstr;
va_start(arg_ptr, num); /*initialize the arg_ptr*/
string = (char *)malloc(420*sizeof(char) + 1);
*string = " ";
for(b=0; b < num; b++)
{
curstr = va_arg(arg_ptr, char *);
string = strcat(string,curstr);
}
printf("\n%s", string);
va_end(arg_ptr);
return string;
}
какой компилятор вы используете? '* string =" ";' недействителен и не должен компилироваться ... – fritzone
Ежедневное напоминание о том, чтобы не выдавать возвращаемое значение 'malloc()'. – Igor
Чтобы завершить заявление @Igor, я рекомендую вам прочитать этот вопрос, потому что я думаю, что это интересная вещь для понимания: http://stackoverflow.com/questions/605845/do-i-cast-the-result-of- malloc – Logar