0

sCopy() 関数から文字列を返そうとしているので、コードの main() 関数で出力できます。助けてください。

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;
}
4

5 に答える 5

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() と fgets() の問題

于 2013-03-15T03:51:21.033 に答える
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;
}
于 2013-03-15T05:18:18.770 に答える
0

のメモリchar *tが割り当てられていません。を使用して、文字列のコピーを直接実装できますstrdup

char *newBuffer = NULL;
...
...
newBuffer = strdup(buffer);
于 2013-03-15T03:17:51.887 に答える
0

試す

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

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

nBufferの代わりにn return を使用しtます。

これは、割り当てなしで実行できる 1 つの方法です。または、メモリを割り当てて、代わりにそれを返しstatic charます。

于 2013-03-15T03:18:07.523 に答える
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入力文字列の末尾にa を追加することに注意してくださいnew line character。したがって、入力した場合、6文字列はの ASCII コードであり、は の ASCII コードです。この改行文字を削除するには、このリンクを参照してください。0x36 0x0a0x3660x0anew line character

于 2013-03-15T03:27:35.753 に答える