我正在嘗試掃描 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); scanf 直到 34(“”的asci 代碼),但它只是掃描所有內容。然后我掃描 int 資料,然后掃描國家。我應該如何將這部分更改為僅掃描名稱?我的輸出是
"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 回圈。
uj5u.com熱心網友回復:
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("\"4[^\"]\" %d \"[^\"]\"\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);
}
或者,您可以使用fgets和strtok
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 ;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/383279.html
