如何在不使用strcpy的情况下将字符数组复制到char指针

时间:2017-02-09 19:50:08

标签: c arrays pointers c-strings

如何在不使用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

我不确定如何解决这个问题。

2 个答案:

答案 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复制到destdest是目标,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;
}