2013-03-15 64 views
0

我想從我的鏡檢查()函數返回一個字符串,所以我可以在我的代碼的main()函數打印出來。請幫忙。返回從一個函數在C語言的字符串參數

const char *sCopy(char buffer[256], int i); 

int main() { 
    int i; 
    int x; 
    char buffer[256]; 
    char newBuffer;//[256]; 
    printf("Please enter a number: "); 
    fgets(buffer, 256, stdin); 
    i = atoi(buffer); 

printf("The value you entered is %d. Its double is %d.\n", i, i*2); 
newBuffer = sCopy(buffer, i); 
printf(newBuffer);  
return 0; 
} 

const char *sCopy(char buffer[256], int i){ 
    char nBuffer[256]; 
    char *t;   
    int x; 
    for(x = 0; x < i; x++){ 
     strcat(t, buffer); 
    } 
    //t = nBuffer; 
    return t; 
} 
+0

SCOPY返回字符指針和newBuffer只是一個炭。 – 2013-03-15 03:19:58

+2

當你根本不使用索引「x」時,什麼是循環使用的點? – 2013-03-15 03:21:41

+0

我使用gcc,for循環中不允許聲明,除非您使用標誌進行編譯。 – kingsolo 2013-03-15 03:33:13

回答

0

char *t的內存未分配。您可以使用strdup直接實現字符串複製。

char *newBuffer = NULL; 
... 
... 
newBuffer = strdup(buffer); 
0

嘗試

char* newBuffer; // point to a c-string // here the return value of sCopy 

static char nBuffer[256]; // make nBuffer survive beyond function call 

,只是使用返回n nBuffer,而不是t

這是你能做到這一點,沒有分配的一種方式。或者分配內存並返回它而不是static char

+0

這個作品謝謝你。 – kingsolo 2013-03-15 03:23:33

0

嘗試以下:

#include <string.h> 
#include <stdio.h> 
#include <stdlib.h> 

void sCopy(char buffer[256], int i, char newBuffer[], int size) 
{ 
    char *t;   
    for(int x = 0; x < i; x++){ 
     strcat(newBuffer, buffer); 
    } 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    int i; 
    char buffer[256] = {0}; 
    char newBuffer[256] = {0}; 
    printf("Please enter a number: "); 
    fgets(buffer, 256, stdin); 
    i = atoi(buffer); 

    printf("The value you entered is %d. Its double is %d.\n", i, i*2); 
    sCopy(buffer, i, newBuffer, 256); 
    printf("%s", newBuffer); 
    return 0; 
} 

注意fgets追加new line character在輸入字符串的結束,所以如果你輸入6那麼字符串是0x36 0x0a其中0x366的ASCII碼和0x0a是爲new line character ASCII碼,以刪除此新行字符,請參閱this link

1

我下面的分析。從我在這裏看到的,你應該梳理一個指向char(char *)的指針和一個char數組之間的區別。我真的很感激,但是你在嘗試之前試圖自己解決它。

const char *sCopy(char buffer[256], int i); 
/* let's start from here, what i represents? Keep in mind that the most of the */ 
/* time an external developer will see just your declaration of a method, always */ 
/* try to give significant names to variables.         */ 

int main() { 
    int i = 0; 
    /* always initialize variables to default values, especially if they are  */ 
    /* going to be indexes in a buffer.           */ 

    int x = 0; 
    char buffer[256] = ""; 
    /* you can even initialize this to "" in order to mimic an empty string,  */ 
    /* that is a char array cointining just \0 (string null-terminator).   */ 

    char newBuffer[256] = ""; 
    /* same here, you always need to declare the size of a char array unless  */ 
    /* you initialize it like this -char newBuffer[] = "hello"-, in which case */ 
    /* the size will automatically be 6 (I'll let you discover/understand */ 
    /* why 6 and not 5).               */ 

    printf("Please enter a number: "); 
    fgets(buffer, 256, stdin); // nice link at the bottom on input reading 
    i = atoi(buffer); 

    printf("The value you entered is %d. Its double is %d.\n", i, i*2); 
    newBuffer = sCopy(buffer, i); 
    printf(newBuffer);  
    return 0; 
} 

/* I am not going to debate the idea of returning a char pointer here :)   */ 
/* Remember that in this case you are returning a pointer to some memory that has */ 
/* been allocated somewhere inside your function and needs to be released (freed) */ 
/* by someone outside your control. Are they going to remember it? Are they  */ 
/* going to do it? In this case "they" is "you" of course.       */ 
/* I'll let you explore alternative approaches.         */ 

const char *sCopy(char buffer[256], int i){ 
    char nBuffer[256] = ""; // see above 
    char *t = NULL; 
    /* you always init a pointer to NULL. As you can see, initializing here will */ 
    /* make you think that there might be problem with the strcat below.   */ 

    int x; // ok here you can omit the init, but be aware of it. 
    for(x = 0; x < i; x++){ 
     strcat(t, buffer); 

    /* what are you missing here? this piece of code is supposed to concatenate the */ 
    /* input buffer to a brand new buffer, pointed by your variable t. In your implementation */ 
    /* t is just a pointer, which is nothing more than a number to a memory location */ 
    /* With the initialization, the memory location you are pointing to is NULL, which */ 
    /* if de-referenced, will cause massive problems.        */ 
    /* What you are missing is the blank slate where to write your data, to which your */ 
    /* pointer will read from.              */ 
    } 
    //t = nBuffer; 
    return t; 
} 

我真的希望這會幫助你。我很抱歉,我不能寫,只是因爲我認爲這是更好,如果你瞭解它的硬盤的方式解決。你可以找到很多指向char的指針,我相信你會解決這個問題。

(輸入讀數)C scanf() and fgets() problem

+0

+1沒有給予解決 – 2013-03-15 05:21:08

+0

這幫助了很多。 – kingsolo 2013-03-15 17:33:10

0
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

const char *sCopy(char buffer[256], int i); 

int main() { 
    int i; 
    int x; 
    char buffer[256]; 
    const char* newBuffer;//[256]; 
    printf("Please enter a number: "); 
    fgets(buffer, 256, stdin); 
    i = atoi(buffer); 

printf("The value you entered is %d. Its double is %d.\n", i, i*2); 
newBuffer = sCopy(buffer, i); //buffer tail '\n' need cut? 
printf(newBuffer); 

    free(newBuffer); 
    return 0; 
} 

const char *sCopy(char buffer[256], int i){ 
    char *t;   
    int x; 

    t=(char*)malloc(strlen(buffer)*i + 1); 
    *t='\0'; 
    for(x = 0; x < i; x++){ 
     strcat(t, buffer); 
    } 
    //t = nBuffer; 
    return (const char*)t; 
}