scanf table C 使用scanf

Scanf table C using scanf

我正在尝试 scanf sql table 而不是对每个符号都使用 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", actors[i].name);到 scanf 直到 34(" 的 asci 代码),但它只是 scanfs everything.Then i scanf int 数据,然后是国家/地区。我应该如何将这部分更改为仅 scanf 名称? 我的输出是

"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)

跳过它

你还要确保函数成功,否则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++;
}