簡體   English   中英

C fgets語義錯誤

[英]C fgets semantic error

我是C語言世界中的新手,並且fgets()函數存在問題。 我用Google搜索了將近2個小時的錯誤,發現了不同的解決方案,但沒有人能解決。

我的課程太大了,無法顯示課程的每個部分,但讓我向您展示有問題的部分:

//... kivansag is a struct(!)
if(check == 1){
        char name;
        printf("Please give me your nickname!\n");
        scanf("%s", &name);
        strcpy(kivansag.name,&name);

        char city;
        printf("Please give me your city!\n");
        scanf("%s", &city);
        strcpy(kivansag.city,&city);

        char *address = malloc(100);
        printf("Please give me your address!\n");           
        fgets(address,100,stdin);

        if((strlen(address)>0) && address[strlen(address)-1] == '\n'){
            address[strlen(address)-1] = '\0';
        }

        strcpy(kivansag.address,address);
        free(address);
}//...

問題是:每次我運行此代碼時,正在運行的服務器在寫出“給我您的地址”后都跳過fgets() ,並執行以下功能。

我可以得到任何建議嗎?

更新:

現在我只有這個:

        printf("Please give me your address!\n");           
        fgets(kivansag.address,sizeof(kivansag.address),stdin);

        if((strlen(kivansag.address)>0) && kivansag.address[strlen(kivansag.address)-1] == '\n'){
            kivansag.address[strlen(kivansag.address)-1] = '\0';
        }

該結構看起來像這樣:

struct Kivansag{
  //...
  char address[100];
};

是的,仍然跳過了我的部分...我也嘗試使用fflush(stdin)來確保一切都清楚了,但沒有用。

 scanf("%s", &name);      //you cant use %s to take input in a char variable
 ...
 scanf("%s", &city);

在這些namecity有兩個char變量,而不是以null terminated字符串。 因此,使用此處-

strcpy(kivansag.name,&name);

導致UB

您可以將它們聲明為數組-

char name[20];
char city[20];
fgets(name,20,stdin);    
...
fgets(city,20,stdin); 
strcpy(kivansag.name,name);      // note address of name is not required 
/* similarly for copying city */

因此,由於下一個fgets也不會被跳過。

然后照常做。

char只是一個字符,您不能使用它來讀取scanf具有%s格式的字符串。 您需要提供一個字符數組。 無需掃描到一個變量然后復制到另一個變量,您可以直接掃描到結構成員。

scanf("%s", kivansag.name);

您也可以直接在變量中使用fgets()

fgets(kivansag.address, sizeof kivansag.address, stdin);
size_t len = strlen(kivansag.address);
if((len>0) && kivansag.address[len-1] == '\n'){
    kivansag.address[len-1] = '\0';
}

在scanf之后,請參閱fgets不起作用,以了解程序為何跳​​過fgets及其修復方法。

這兩行總是會產生不確定的行為。

未定義的行為可能導致任何結果,包括段錯誤事件

    char name;
    ....
    scanf("%s", &name);

函數scanf()始終將NUL字節附加到輸入的字符串中。

char name只定義了一個字節。

“%s”沒有限制,因此用戶可以/將始終超出該一個字節的緩沖區。

建議類似:

    char name[30];
    ....
    if( 1 != scanf("%29s", &name) { // handle error }

這行:

scanf("%s", &city);

在輸入流中留下換行符。

以下對fgets()的調用將看到換行符,並立即返回,除了換行符和NUL字節外,什么都沒有放入輸入緩沖區

這行很亂:

if((strlen(address)>0) && address[strlen(address)-1] == '\n'){
        address[strlen(address)-1] = '\0';
    }

可能會或可能不會找到嵌入的換行符,並用NUL字節覆蓋它:建議:

if( char* newline = strstr( address, "\n" ) )
    *newline = '\0';

甚至有“更巧妙”的方法來替換字符串中的換行符,但是這種方法很容易理解。

暫無
暫無

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

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