2017-02-22 104 views
-4

我有一個輸入文件,這只是字符串數組指針只傳遞一個字符

蘋果 香蕉 梨 等都在不同線路上

,我需要用一個循環去行逐行將每個字符串分配給一個變量,然後再將該字符串傳遞給其他函數。我通過使用fscanf(必需)來做到這一點。目前,我在我的main()

char *name; 
for (i=0; i<=fileLength; i++) { 
    input(fp1, name) 
    printf("%s", &name); 
    // later would pass name elsewhere 
} 

void input(FILE *fp1, char name) { 
    fscanf(fp1, "%s", &name); 
    printf("%s", &name); 
} 

如果我運行從輸入功能的printf語句,我得到整個字符串完美。如果我從main運行它,我只會得到「A」。儘管輸入函數中的printf語句正確輸出,但在執行香蕉行時不會更改爲「B」。什麼給和我如何獲得名稱var打印出我的main(),然後能夠傳遞該var?

+0

'炭name' ... hmmmm –

+0

'空隙輸入(FILE * fp1的,字符*名){ 的fscanf(FP1, 「%S」,姓名) ; printf(「%s」,name); }初學者 –

+0

'char * name'被初始化,你需要爲它分配空間。 – RoadRunner

回答

0

您的代碼有未定義的行爲。

您不能在一個單獨的char中存儲超過0個字符的字符串(因爲終結器接受一個字符,在這種情況下,您可以有0個字符的實際字符串)。

必須使用字符數組,使一些空間:

void input(char *name, FILE *fp1) 
{ 
    if(fscanf(fp1, "%s", name) == 1) 
    printf("%s\n", name); 
} 

然後調用它,比如:

char namebuffer[128]; 

input(namebuffer, fp1); 

請注意,我已經編輯這篇使用fscanf()因爲這是一個要求,但這是一個非常糟糕的解決方案。它不會讀取帶有空格的字符串,因此典型的「名字姓氏」全名不會正確讀取。有辦法解決這個問題,但我不知道該在哪裏畫線。

而且緩衝,因爲沒有保護溢出可以很容易地在這裏發生。這可以在保持fscanf()的同時添加,但有點煩人。

+0

也可能想要使用'char * input ...'並且能夠返回成功/失敗('NULL')給調用者。 (OP還提到使用'fscanf'作爲要求 - 可憐的傢伙) –

0

您正在使用的初始化指針char *name,這會導致不確定的行爲。你需要確保name有足夠的空間來保存你從文件中讀取的字符串。您可以簡單地創建一個VLA,例如char name[n],它可以容納最多n個字符。另一種選擇是動態分配name,但這會造成不必要的開銷。

你還需要檢查的fscanf()回報,因爲它返回掃描的項目數。在你的情況下,你一次只想讀一個單詞,直到EOF。最好還使用fgets(3)來讀取輸入,而不是fscanf()

這裏是一個小例子:

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

#define WORDSIZE 100 

/* function which reads one word */ 
int input(FILE *stream, char word[]) { 
    if (fscanf(stream, " %99s", word) != 1) { 
     return 0; 
    } 
    return 1; 
} 

int main(void) { 
    FILE *fptr; 

    /* array which holds words */ 
    char word[WORDSIZE]; 

    fptr = fopen("somewords.txt", "r"); 
    if (fptr == NULL) { 
     fprintf(stderr, "Cannot open file\n"); 
     exit(EXIT_FAILURE); 
    } 

    /* Keeps running loop until input() returns 0 */ 
    while (input(fptr, word)) { 
     printf("%s\n", word); 
    } 

    return 0; 
}