簡體   English   中英

Visual Studio Code 和 C 編程

[英]Visual Studio Code and C programming

我正在嘗試學習 C 並決定使用 Visual Studio 作為我可以練習代碼的基礎。 我已經設置好了所有東西,並且也開始編寫代碼,但我似乎遇到了一個看不到用戶輸入的問題。

這是我的程序:

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

int main()
{

    char string[] = "";
    char reversed[] = "Placeholder";

    printf("Please enter an input string.\n");
    scanf("%s", &string);



    printf("Your original string is %s\n", string);
    printf("The string reversed is %s", reversed);

    return 0;
    
}

當我運行這個程序時,第一個 printf 語句永遠不會打印,用戶輸入也不會顯示在任何地方(終端中也沒有)。 它只是說程序正在運行。 當我強行停止它時,它會說“完成”。 這就是所有發生的事情(我必須強制停止,因為我從來沒有看到輸入字符串的地方,因此程序只是繼續運行等待輸入)。 我剛剛設置了 Visual Studio,所以我可能錯過了一些東西,這是一個簡單的修復,但不太確定它是什么。

您輸入的字符串為空。 首先避免將變量命名為“字符串”,因為標准庫中可能已經定義了一個。 並嘗試為您的字符串分配更多空間以便能夠輸入數據。

`

char str[128];
char reversed[] = "Placeholder";

printf("Please enter an input string.\n");
scanf("%s", &str);



printf("Your original string is %s\n", str);
printf("The string reversed is %s", reversed);

return 0;

` 另外,請務必閱讀更多關於 arrays、c 中的字符串和函數的信息。 您編寫的代碼可能無法按您的預期工作。

有幾個問題。

  1. 您沒有為string分配任何 memory ,因此當用戶輸入某些內容時,它會寫入它不擁有的 memory ,從而導致未定義的行為。
  2. 你的scanf是錯誤的,有點。 您必須為其提供指向 memory 的指針,其中輸入應為 go,您提供的是指針的地址。 在這種情況下,它們是相同的,但如果這是一個指向堆 memory 的指針,例如, &string將不會指向您保留的 memory。

相反,嘗試這樣的事情:

int main()
{
    char string[64] = ""; // string can now hold 63 user-input characters plus
                          // one for the NUL terminator, which scanf will add
                          // automatically.
    char reversed[] = "Placeholder";  // This reserves at least 12 bytes, 11 for the text plus the NUL terminator.

    printf("Please enter an input string.\n");
    scanf("%s", string);  // string decays to a pointer to where its memory is allocated.


    printf("Your original string is %s\n", string);

    return 0;
}

請注意,如果您輸入(在這種情況下)更多 >= 64 個字符,您仍然可以溢出您的string緩沖區,並且您將回到您開始的位置。 我相信scanf有一種方法可以限制接受的輸入量,但需要查看如何。 另一種選擇是使用fgets接受有限的輸入。

暫無
暫無

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

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