簡體   English   中英

C無法兩次打印字符串

[英]C can't print a string twice

我正在做一個必須創建Black Jack模擬的項目。 因此,我首先創建了一個牌組和一個繪制功能。 由於C中沒有字符串,因此我創建了兩個指針數組以將它們用作自定義字符串數組。 事實是,當我打印卡以查看其價值和西裝時,才第一次打印期望的卡。 第二次是一團糟。 誰可以給我解釋一下這個 ? 這是我的代碼

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
char* suit[] = {"Diamonds", "Hearts", "Spades", "Clubs"};
char* facevalue[] = { "Seven", "Eight", "Nine", "Ten", "Jack","Queen", "King", "Ace"};
char* drawCard()
{
    char* card[50];
    int cardNumber=rand()%8;
    int cardColor=rand()%4;
    strcpy(card,facevalue[cardNumber]);
    char of[]=" of  ";
    char* xrwma =suit[cardColor];
    strncat(card,of,5);
    strncat(card,xrwma,8);
    return card;
}
int main()
{
    srand(time(NULL));
    char* c=drawCard();
    puts(c);
    puts(c);
    return 0;
}

問題是您正在返回指向自動數組的指針。 函數返回后,數組將超出范圍。 嘗試取消引用返回的指針會導致未定義的行為 從技術上來說,對puts()的第一次調用在您的情況下確實有效。 第二個沒有。

請參閱將指針返回自動變量以進行討論。

一種解決方案是在main()分配數組,將指針(及其大小)傳遞給drawCard()然后讓drawCard()填充它。

變量card是函數drawCard的局部數組。

這樣,當函數drawCard執行時,它會分配在堆棧中。

函數drawCard返回后,您將不再可以依賴此數組的內容。

任何后續的操作都可以隨時覆蓋該內存。

您的程序在第一次調用puts成功將其打印出來的事實,無非是“碰運氣”-在第一次調用函數fputs時,正確的字符恰好位於變量c指向的內存中。

但是由於函數fputs也使用堆棧,因此此后不久將覆蓋該內存,並且在您再次調用fputs時,先前的字符值不再存在。

順便說一句,看着變量card的用法,我感覺到您打算將其聲明為char card[50]而不是char* card[50]

嚴格來說,問題在於drawCard()返回的自動變量的生存期。 僅對一個函數調用實例有用。 C不會阻止您返回它,但是以后肯定不會有用。

這樣做的原因是:在堆棧上分配了本地( 自動存儲類)。 真的很快 一個算術運算符(從堆棧指針中減去)可以分配函數中的每個局部變量。

但是當調用返回時,堆棧將被調整回去。 此時, 下一個函數調用實例將重用相同的空間。 如果您在該空間上停留參考,它將被表面上隨機且不斷變化的東西所破壞...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM