我正在嘗試撰寫一個程式,該程式從 stdin 中獲取名字和姓氏,并用換行符分隔,并將它們存盤在 struct 陣列內的 char 陣列中。在我想以某種方式列印它們之前,一切似乎都運行良好。我需要在輸出中像這樣格式化名稱:
<lastName>, <firstName>這就是為什么我添加了一個函式來在決議值時從每行末尾洗掉尾隨換行符。但是,執行此操作時它不會回傳任何內容:
printf("%s, %s",people[0].lastName, people[0].firstName);
但是,當在單獨的行上列印值時,例如
printf("%s\n",people[0].lastName);
printf("%s\n",people[0].firstName);
或使用看跌期權
puts(people[0].lastName);
它作業得很好。當我注釋掉 removeNewline() 函式時,它似乎解決了這個問題。但是最后的換行符我無法按照我所描述的方式格式化輸出。這是我的完整代碼:
#include <stdio.h>
#include <string.h>
#define MAX_STRING_LENGTH 100
#define MAX_PEOPLE 42
struct Person{
char firstName [MAX_STRING_LENGTH];
char lastName[MAX_STRING_LENGTH];
};
void removeNewline(char * string){
for(int i = 0; string[i] != '\0'; i ){
if(string[i] == '\n'){
string[i] = '\0';
}
}
}
int parseData(struct Person * people){
int peopleCounter;
for(peopleCounter = 0; peopleCounter < MAX_PEOPLE; peopleCounter ){
char firstName[MAX_STRING_LENGTH];
char lastName[MAX_STRING_LENGTH];
if(fgets(firstName,MAX_STRING_LENGTH,stdin) == NULL){
break;
}
fgets(lastName,MAX_STRING_LENGTH,stdin);
removeNewline(firstName);
removeNewline(lastName);
strcpy(people[peopleCounter].firstName,firstName);
strcpy(people[peopleCounter].lastName,lastName);
}
return peopleCounter;
}
int main(int argc, char *argv[]){
struct Person people [MAX_PEOPLE];
parseData(people);
//PROBLEM
printf("%s, %s",people[0].firstName, people[0].lastName);
for(int i = 0; i < 2; i ){
printperson(people, i);
}
}
我通過重定向從文本檔案中提供值,如下所示:
./main <people.txt
people.txt example:
George
Washington
Thomas
Jefferson
desired output:
Washington, George
Jefferson, Thomas
uj5u.com熱心網友回復:
我無法重現該問題。以下是細微的變化:
removeNewline(): 在我們處理完第一個換行符后回傳。精簡了一點。parseData():直接存盤在結構中而不是臨時變數中。重命名peopleCounter為,i因為它是不必要的長。也檢查 2nd 的回傳值fgets()。main():洗掉了對回傳值的呼叫printperson()和回圈,其中兩個引數變數在printf()陳述句中按預期順序切換。
#include <stdio.h>
#include <string.h>
#define MAX_STRING_LENGTH 100
#define MAX_PEOPLE 42
struct Person{
char firstName[MAX_STRING_LENGTH];
char lastName[MAX_STRING_LENGTH];
};
void removeNewline(char *s) {
for(;;) {
*s *= (*s != '\n');
if(!*s ) return;
}
}
int parseData(struct Person *people){
int i = 0;
for(; i < MAX_PEOPLE; i ){
if(!fgets((people i)->firstName,MAX_STRING_LENGTH,stdin))
break;
removeNewline((people i)->firstName);
if(!fgets((people i)->lastName,MAX_STRING_LENGTH,stdin))
break;
removeNewline((people i)->lastName);
}
return i;
}
int main(int argc, char *argv[]) {
struct Person people[MAX_PEOPLE];
int n = parseData(people);
for(int i = 0; i < n; i ) {
printf("%s, %s\n", people[i].lastName, people[i].firstName);
}
}
輸出是:
Washington, George
Jefferson, Thomas
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/514930.html
標籤:数组C指针结构
