Неудивительно, почему вы не получили соответствующий вывод, потому что с предоставленным кодом вы, вероятно, получите ошибку сегментации. Помимо этого, в коде есть несколько проблем. Чтобы объяснить их все, а также ответить на главный вопрос, взорвется рамка. Вы можете увидеть, как я исправил код следующим образом.
char * strcpy (char * destination, const char * source)
strcpy
является потенциальным риск переполнения буфера, если буфер destination
char
недостаточно велик для хранения строки, которая будет скопирована source
. Это в вашем случае хорошо, потому что все буферы userString[i]
и tempVal[i]
имеют одинаковую емкость (количество элементов char
), но при изменении кода это может быть вредно.
Обратите внимание, что вы Также следует ограничить количество вводимых символов, когда вы ловите строку из stdin
. По этой причине fgets()
безопаснее, чем scanf()
, поскольку для него явно требуется максимальное количество символов для чтения.
char * strncpy (char * destination, const char * source, size_t num );
strncpy
не может добавить завершающий нулевой символ, если первые num
символы исходной строки не содержат завершающего \0
.
Скорее используйте snprintf()
, который безопасен для 1. проверки размера буфера назначения и ограничения количества символов для чтения и 2. всегда добавляет нулевой символ (при условии, что процесс сканирования прошел успешно и ошибок нет) произошло):
#include <stdio.h>
#include <string.h>
int main(void) {
const int NUM_VALS = 20;
int i;
int s_num;
printf("Enter number of strings in array: ");
scanf("%d", &s_num);
getchar();
char userString[s_num][NUM_VALS];
char tempVal[s_num][NUM_VALS];
for (i = 0; i < s_num; ++i) {
printf("Enter string at userString[%d]: ",i);
if(fgets(userString[i],NUM_VALS, stdin) == NULL)
{
// error handling
if(ferror(stdin))
{
// handle I/O error.
}
else if(feof(stdin))
{
// end of file is reached.
}
}
else
userString[i][strcspn(userString[i], "\n")] = 0;
//printf("%s", userString[i]);
}
printf("\n");
for (i = 0; i < s_num; ++i) {
if(snprintf(tempVal[i], sizeof(tempVal[i]), "%s", userString[i]) < 0)
{
// error handling
fprintf(stderr,"Encoding error occurred!");
}
printf("tempValue[%d]: %s\n", i, tempVal[i]);
}
return 0;
}
Вывод при пробном запуске:
Enter number of strings in array: 3
Enter string at userString[0]: hello
Enter string at userString[1]: world
Enter string at userString[2]: test
tempValue[0]: hello
tempValue[1]: world
tempValue[2]: test