如何在不使用strcpy手动的情况下将char数组的字符复制到char指针中。例如:
char *Strings[NUM];
char temp[LEN];
int i;
for (i = 0; i < NUM; i++){
fgets(temp, LEN, stdin);
Strings[i] = malloc(strlen(temp)+1);
Strings[i] = temp; // What would go here instead of this,
// because this causes this to happen->
}
Input:
Hello
Whats up?
Nothing
Output (when the strings in the array of char pointers are printed):
Nothing
Nothing
Nothing
我不确定如何解决这个问题。
答案 0 :(得分:1)
在您的示例中,您使用以下两行:
Strings[i] = malloc(strlen(temp)+1); /* you should check return of malloc() */
Strings[i] = temp;
哪个不对。第二行只是覆盖从malloc()
返回的指针。您需要使用<string.h>
中的strcpy()
:
Strings[i] = malloc(strlen(temp)+1);
strcpy(Strings[i], temp);
char *strcpy(char *dest, const char *src)
将指向的字符串从src
复制到dest
。dest
是目标,src
是要复制的字符串。返回指向dest
的指针。
您也没有检查fgets()
的返回,NULL
会在失败时返回\n
。您还应该考虑删除fgets()
附加的Strings[i]
字符,因为您复制到strdup()
的字符串将有一个尾随换行符,这可能不是您想要的。
由于另一个答案显示了如何手动完成,您可能还想考虑仅使用strdup()
为您进行复制。
malloc()
返回指向新字符串的指针,该字符串与字符串 str 重复。内存从#include <stdio.h> #include <stdlib.h> #include <string.h> #define LEN 3 #define BUFFSIZE 20 int main(void) { char *strings[LEN] = {NULL}; char buffer[BUFFSIZE] = {'\0'}; size_t slen, strcnt = 0, i; printf("Input:\n"); for (i = 0; i < LEN; i++) { if (fgets(buffer, BUFFSIZE, stdin) == NULL) { fprintf(stderr, "Error from fgets()\n"); exit(EXIT_FAILURE); } slen = strlen(buffer); if (slen > 0 && buffer[slen-1] == '\n') { buffer[slen-1] = '\0'; } else { fprintf(stderr, "Too many characters entered\n"); exit(EXIT_FAILURE); } if (*buffer) { strings[strcnt] = strdup(buffer); if (strings[strcnt] == NULL) { fprintf(stderr, "Cannot allocate buffer\n"); exit(EXIT_FAILURE); } strcnt++; } } printf("\nOutput:\n"); for (i = 0; i < strcnt; i++) { printf("%s\n", strings[i]); free(strings[i]); strings[i] = NULL; } return 0; }
获取,并使用free()
从堆中释放。
以下是一些执行额外错误检查的示例代码。
{{1}}
答案 1 :(得分:-1)
所以发生的事情是你改变了temp的值,但是所有的指针都指向了temp的一个实例。您需要分配内存,然后手动复制数组。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
int LEN = 20;
int NUM = 3;
char* Strings[NUM];
char temp[LEN];
int i,j;
for (i=0;i<NUM;i++){
fgets(temp,LEN,stdin);
Strings[i] = (char*)malloc(strlen(temp)+1);
for(j=0;j<=strlen(temp);j++) { /* this part */
if (j == strlen(temp))
Strings[i][j - 1] = temp[j]; /* overwrite \n with the terminating \0 */
else
Strings[i][j] = temp[j];
}
}
for (i=0;i<NUM;i++)
printf("%s\n", Strings[i]);
return 0;
}