2015-12-01 39 views
-5

所以,我有這個代碼。我有一些關於它的問題,我在開始學習C++。
我的問題是:C++結構和字符

我如何在scanf中讀取多個名稱?

或者當我想要讀取街道名稱[strada],例如:1 northwood 34/6,當我插入空間它通過線路並獲得下一行時,我需要更改以便作爲我工作想?

爲什麼我不能打印我的人當我初始化?

感謝

//create a struct which represent a person and that person must contain 
//firstname lastname age, and adress. adress must contain street city and 
//country 

//define a function which it will be used for reading a person from keyboard. //define a function which will initialise a person. 
//create a function which it will be used for releasing allocated resources for a person. 
//create a functon which it will be used for printing the data about a person 
// read from the keyboard a collection of persons, arrange those persons decreasing by age using qsort. 

#include "stdafx.h" 
#include <malloc.h> 
#include <stdlib.h> 
#include <string> 
using namespace std; 

struct adresa{char* strada, *oras,*judet;}; 
struct persoana{char* nume, *prenume;int varsta;adresa adr; }; 

void trimNewline(char* str) 
{ 
int len = strlen(str); 
if (str[len - 1] == '\n') 
{ 
    str[len - 1] = '\0'; 
} 
} 
void citestePersoana(persoana* pers){ 
    printf("Nume:"); 
    scanf("%s", pers->nume); 
    printf("Prenume:"); 
    scanf("%s", pers->prenume); 
    printf("Varsta:"); 
    scanf("%d", pers->varsta); 
} 

void citesteAdresa(adresa* adr){ 
printf("Strada:"); 
fgets(adr->strada, 100, stdin); 
trimNewline(adr->strada); 

printf("Oras:"); 
fgets(adr->oras, 100, stdin); 
trimNewline(adr->oras); 

printf("Judet:"); 
fgets(adr->judet, 100, stdin); 
trimNewline(adr->judet); 
} 

void initPersoana(persoana* pers){ 
    pers->nume = (char*)malloc(100 * sizeof(char)); 
    pers->prenume = (char*)malloc(100 * sizeof(char)); 
    pers->varsta = (int)malloc(100 * sizeof(int)); 
} 

void initAdresa(adresa* adr){ 
    adr->strada = (char*)malloc(100 * sizeof(char)); 
    adr->oras = (char*)malloc(100 * sizeof(char)); 
    adr->judet =(char*)malloc(100 * sizeof(char)); 
} 

void afispers(){ 
    persoana x; 
    adresa y; 
    printf("Nume:%s", x.nume); 
    printf("Prenume:%s", x.prenume); 
    printf("Varsta:%s", x.varsta); 
    printf("Strada:%s", y.strada);printf("Oras:%s", y.oras); 
    printf("Judet:%s", y.judet); 
} 

int _tmain(int argc, _TCHAR* argv[]){ 
    persoana persoanaCurenta; 
    adresa adresaCurenta; 
    initPersoana(&persoanaCurenta); 
    initAdresa(&adresaCurenta); 
    citestePersoana(&persoanaCurenta); 
    citesteAdresa(&adresaCurenta); 
    afispers(); 
    return 0; 
} 
+0

你可以格式化你的代碼,所以它的可讀性 – EdChum

+0

請看一看可用來格式化你的代碼的格式化工具,因此它可以被讀取。 – rghome

+0

由於「預處理程序指令」無效,您的「代碼」無法編譯。 – MikeCAT

回答

0

如果你想閱讀與空格的地址,如

1 northwood 34/6 

成一個字符串,最好使用fgets,而不是scanf

fgets(adr->strada, 100, stdin); 

然後從它修剪換行符。

int len = strlen(adr->strada); 
if (adr->strada[len-1] == '\n') 
{ 
    adr->strada[len-1] = '\0'; 
} 

您可以將該代碼放入一個函數中,並將其重用於您讀取的其他數據。

void trimNewline(char* str) 
{ 
    int len = strlen(str); 
    if (str[len-1] == '\n') 
    { 
     str[len-1] = '\0'; 
    } 
} 

,然後用它作爲:

void citesteAdresa(adresa* adr){ 
    printf("Strada:"); 
    fgets(adr->strada, 100, stdin); 
    trimNewline(adr->strada); 

    printf("Oras:"); 
    fgets(adr->oras, 100, stdin); 
    trimNewline(adr->oras); 

    printf("Judet:"); 
    fgets(adr->judet, 100, stdin); 
    trimNewline(adr->judet); 
} 
+0

我可以使用void作爲名稱嗎?如何打印整個人的數據,我應該使用printf? –

+0

我按照你向我解釋的那樣編輯了代碼,但是當它到達第一個fgets時,它跳到第二個scanf,我不知道問題出在哪裏,我更新了代碼。你可以向我解釋我的錯在哪裏? @R Sahu –

+0

@SabăuAdrian,編輯你的代碼非常重要。當你這樣做時,基於舊代碼的答案就沒有意義了。 –