[英]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);
在這些name
和city
有兩個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.