char * word; printf("%s",word)问题

时间:2016-02-12 11:20:08

标签: c printf

StackOverflow上的第一篇文章,所以如果我没有做好,我会道歉。我顽固的运动,我需要做一个"刽子手游戏"我试着从" .txt"文件,然后我有我的加密函数,用'*'替换每个字母,并在'\0'位置放置lenght+1以结束字符串。

我遇到了问题以获得char*的大小,我最大的问题是我无法在控制台上正确显示它,我只会打印出奇怪的符号。

这是我的代码

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

void pendu()
{
    FILE *fichier = NULL;
    fichier = fopen("dico.txt", "r");
    if (fichier == NULL)
    {
        printf("Erreur ouverture du fichier");
    }
    int taille = get_size("dico.txt");

    int nb;
    srand(time(NULL));
    nb = rand() % taille;

    char *momo = get_word(nb, fichier);

    printf("Vous allez jouer au pendu! \n");
    printf("Voici le mot a trouver : \n");
    int longueur = sizeof(momo); // i know size of return size in byte so may i
    //do sizeof(word)/sizeof(char) ?

    char *motcrypt = cryptage(momo,longueur);

    printf(" %s \n", motcrypt); // here is the main Problem.
    int tour = 10;
    while (tour > 0)
    {
        char lettre;

        printf(" %s \n", motcrypt);
        printf("il vous reste %d tour(s) \n", tour);

        printf("proposer une lettre :", tour);

        scanf(" %c", &lettre); // space needed !!?!!

        printf("\n");
        char *motcrypt2 = motcrypt;
        for (int i = 0; i < longueur; i++)
        {
            if (lettre == momo[i])
            {
                motcrypt2[i] = lettre;
            }
        }
        if (motcrypt == motcrypt2)
        {
            tour = tour-1;
            printf("%s", motcrypt);
        }
        if (motcrypt2 == momo)
        {
            motcrypt = motcrypt2;
            printf("%s", motcrypt);
            printf("Vous avez gagner! \n");
            printf("Appuyer sur un bouton pour rejouer \n");        
            system("Pause");

        }
        else if (tour == 0)
        {
            printf("Vous avez perdu\n");
            printf("Appuyer sur un bouton pour rejouer \n");
            system("Pause");
            pendu();
        }
    }

}

void main()
{
    pendu();
}

编辑:这是我的&#34; cryptage&#34;功能:

char* cryptage(char *yala,int x)
{
    int i = 0;
    char crypted[30];
    while (i < x)
    {
        crypted[i] = '*';
        crypted[i + 1] = '\0';
        i++;        
    }
    return crypted;
}

我的加密功能可以用&#39; *&#39;替换每个字母。然后放一个&#39; \ 0&#39;在lenght + 1位置结束字符串。

PS:我希望有人解释为什么printf("%s",word)输出的结果与printf(" %s",word)

相同

2 个答案:

答案 0 :(得分:2)

您的代码存在一些问题,但让我们从您的cryptage函数开始:

char* cryptage(char *yala,int x)
{
int i = 0;
char crypted[30];
while (i < x)
{
    crypted[i] = '*';
    crypted[i + 1] = '\0';
    i++;        
}
return crypted;
}

除了错误缩进之外,您将返回一个指向数组的指针,该数组的自动存储持续时间在函数返回时超出范围。使用该指针将导致未定义的行为(包括可能是崩溃或奇怪的输出,或者偶尔出现正常工作)。您应该为crypted动态分配存储空间(查找malloc),或者接受指向它的指针作为参数:

char* cryptage(char *yala, int x, char *crypted)
{
    int i = 0;
    while (i < x)
    {
        crypted[i] = '*';
        crypted[i + 1] = '\0';
        i++;        
    }
    return crypted;
}

这一行:

int longueur = sizeof(momo); // i know size of return size in byte so may i

...可能是为了获得momo所指向的字符串的长度,而不是指针本身的大小。因此应该如下:

size_t longueur = strlen(momo); // i know size of return size in byte so may i

几个if语句似乎试图比较字符串:

    if (motcrypt == motcrypt2)

...但这是比较指针,而不是字符串内容。您需要使用strcmp函数:

    if (strcmp(motcrypt,motcrypt2) == 0)

您尚未显示其他各种方法的定义,因此无法为您提供完整的问题列表。当您发布到StackOverflow时,您应该发布一个完整的(但是 minimal )示例,该示例展示了该问题(请参阅MCVE)。

答案 1 :(得分:1)

warning: function returns address of local variable [-Wreturn-local-addr]
 return crypted;
 ^

当我尝试编译此代码时(在填写缺少的函数之后),这是我立即得到的警告。

您正在尝试根据堆栈返回变量的地址。稍后调用printf时会有两行,它会覆盖存储crypted的区域。

从堆中分配内存(请参阅:malloc)并返回该地址。打印后别忘了free