Неясно, выполняется ли код OP внутри main () или пользовательской функции и какое значение возвращается.Тем не менее, после удаления лишних переопределений переменных, вот как я получил рабочий код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
char * name[2];
char * name2[2]={ "emma", "olsson" };
char inputName[10];
char names[BUFSIZ];
int i = 0;
// case 1
name[0] = "john";
name[1] = "doe";
printf("%s %s\n", name[0],name[1]); //john doe
// case 2
printf("%s %s\n", name2[0],name2[1]);//emma olsson
// case 3
for (i = 0; i < 2; i++){
name[i] = name2[i];
}
printf("%s %s\n", name[0],name[1]);//emma olsson
// case 4
i=0;
while (fgets(inputName, sizeof(inputName), stdin) != NULL && (i < 2) ){
strcat(names,inputName);
i++;
}
printf("\n%s\n",names);
return 0;
}
См. Живой код здесь
OP должен заменить одинарные кавычки вокруг doe
с двойными кавычками, которые обозначают строку с нулевым символом в конце.Одиночные кавычки предназначены для одного символа, то есть «a» относится к значению байта, в то время как «a» обозначает строку, содержащую два символа: «a» и «\ 0».
Также OP долженвключить две другие библиотеки для облегчения выполнения.В частности, string.h необходим для правильного выполнения встроенных строковых функций.
Случай 2 и Случай 3 работают, потому что строки заключаются в двойные кавычки вместо одинарных кавычек.Обратите внимание, что в каждом случае спецификатор формата "% s" для printf () указывает, что строка должна быть отображена.
В последнем случае fgets () относительно stdin при успешном завершении возвращает пользовательский ввод какстрока.Но этот вход будет переопределен в цикле while, если только на каждой итерации вы не объедините старый вход с новым.В противном случае, когда значения элемента inputName изменяются, поскольку его адрес остается постоянным, отображается только самая последняя входная строка.Вот некоторый код, который иллюстрирует эту точку:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
char * name[2];
char inputName[10];
int i = 0;
while (fgets(inputName, sizeof(inputName), stdin) != NULL && (i < 2) ){
printf("inputName: %p points to: %s",inputName,inputName);
name[i++] = inputName;
}
printf("\n name[0]: %p points to: %s\n name[1]: %p points to: %s",name[0],name[0],name[1],name[1]);
return 0;
}
Output:
inputName: 0x7fff8a511a50 points to: Maxine
inputName: 0x7fff8a511a50 points to: Pauline
name[0]: 0x7fff8a511a50 points to: Pauline
name[1]: 0x7fff8a511a50 points to: Pauline
См. живой код.
Кстати, вам не нужен массив для отображения имен идействительно, можно отображать имена вне цикла, если в цикле код объединяет пользовательский ввод.