簡體   English   中英

scanf表C使用scanf

[英]Scanf table C using scanf

我正在嘗試掃描 sql 表而不對每個符號使用 scanf,但是我的代碼輸出了某種垃圾。 輸入

8
"Peter Falk" 1927 "USA"
"Oleg Tabakov" 1935 "USSR"
"Andrei Mironov" 1941 "USSR"
"Arnold Schwarzenegger" 1947 "USA"
"Jean Reno" 1948 "France"
"Sharon Stone" 1958 "USA"
"Tom Cruise" 1962 "USA"
"Ryoko Hirosue" 1980 "Japan"

我的代碼

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

typedef struct ActorBio {
    char name[35];
    int BirthYear;
    char country[15];
} ActorBio;


int main() {
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    int n1;
    scanf("%d", &n1);
    ActorBio *actors = malloc(sizeof(ActorBio) * (n1 + 2));
    getchar();
    for (int i = 0; i < n1; i++) {
        scanf("%[^34]s\n", actors[i].name);
        scanf("%d\n",&actors[i].BirthYear);
        gets(actors[i].country);
        printf("%s %d %s\n",actors[i].name,actors[i].BirthYear,actors[i].country);
    }
    return 0;
}

我使用 scanf("%[^34]s\n", actor[i].name); 掃描到 34(asci 碼“),但它只是掃描所有內容。然后我掃描 int 數據,然后是國家/地區。我應該如何將這部分更改為僅掃描名稱?我的 output 是

"Peter Falk" 1927 "USA"
"Oleg Tabako# 35 "USSR"
"Andrei Mironov" 19 41 "USSR"
"Arnold Schwarzenegger" 19 47 "USA"
"Jean Reno" 19 48 "France"
"Sharon Stone" 1958 "USA"
"Tom Cruise" 1962 "USA"
"Ryoko Hirosue" 1980 "Japan" 824189541 962 "USA"
"Ryoko Hirosue" 1980 "Japan"
 Hirosue" 1980 "Japan" 0 
 0 
 0 

我希望我的結構 ActorBio 正確保存信息並使用 scanfs 而不是 while 循環。

 int n1; scanf("%d", &n1);

緩沖區中還有一個\n字符,下次讀取。 您可以使用scanf("%d\n", &n1)跳過它

您還需要確保 function 成功,否則n1未初始化。 您只需要分配n1個項目。

int n1;
if (scanf("%d\n", &n1) != 1) 
{ printf("format error\n"); return 0; }

ActorBio* actors = malloc(sizeof(ActorBio)* n1);
if (!actors) { return 0; }

for (int i = 0; i < n1; i++)
{
    if (3 != scanf("\"%34[^\"]\" %d \"%14[^\"]\"\n", 
        actors[i].name, &actors[i].BirthYear, actors[i].country))
        continue;
    printf("%s %d %s\n", actors[i].name, actors[i].BirthYear, actors[i].country);
}

或者,您可以使用fgetsstrtok

char buf[1024];
for (int i = 0; i < n1;)
{
    if (!fgets(buf, sizeof(buf), stdin))
        break;
    
    memset(&actors[i], 0, sizeof(ActorBio));

    char* token;
    token = strtok(buf, "\"");
    if (!token) continue;
    strncpy(actors[i].name, token, sizeof(actors[i].name) - 1);

    token = strtok(NULL, " ");
    if (!token) continue;
    actors[i].BirthYear = atoi(token);

    token = strtok(NULL, "\"");
    if (!token) continue;
    strncpy(actors[i].country, token, sizeof(actors[i].country) - 1);

    printf("%s %d %s\n", actors[i].name, actors[i].BirthYear, actors[i].country);

    i++;
}

暫無
暫無

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

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