使用 strcmp 的输出不正确
Incorrect output using strcmp
我正在编写 HackerRank 30 天代码中的第 8 天,我遇到了 strcmp
的问题。
该代码向用户询问人名及其号码,然后询问其他姓名,如果之前未输入姓名,则输出 Not found
,但如果输入,则输出姓名和他的号码。但由于某种原因,输出仅在 for
语句的最后一个循环中起作用。
代码:
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
typedef struct {
char name[100];
int number;
} phonebook;
int main() {
int n = 0;
do {
scanf("%i", &n);
} while (n < 1 || n > 100000);
int i = 0;
phonebook people[n];
for (i = 0; i < n; i++) {
scanf("%s %i", people[i].name, &people[i].number);
}
char othernames[n][100];
for (i = 0; i < n; i++) {
scanf("%s", othernames[i]);
}
for (i = 0; i < n; i++) {
if (strcmp(othernames[i], people[i].name) == 0) {
printf("%s=%i\n", people[i].name, people[i].number);
} else {
printf("Not found\n");
}
}
return 0;
}
你没有找到othernames
从头到尾每次都比较people
,需要替换
for (i = 0; i < n; i++) {
if (strcmp(othernames[i], people[i].name) == 0) {
printf("%s=%i\n", people[i].name, people[i].number);
}
else {
printf("Not found\n");
}
}
至
bool found = false;
for (i = 0; i < n; i++) {
for ( j = 0 ; j < n ; j++ ) {
if (strcmp(othernames[j], people[i].name) == 0) {
printf("%s=%i\n", people[i].name, people[i].number);
found = true;
}
}
}
if ( found == false ) printf("Not found\n");
问题是 othernames
应该只是 char
的数组,而不是矩阵。对于每个输入的其他名称,您必须扫描整本 phone 书才能找到它或显示 Not found
。按照编码,您只测试输入的第 i 个其他名称是否恰好对应于 phone 书中的第 i 个条目。
这是修改后的版本:
#include <stdio.h>
#include <string.h>
typedef struct {
char name[100];
int number;
} phonebook;
int main() {
int n = 0;
do {
if (scanf("%i", &n) != 1)
return 1;
} while (n < 1 || n > 100000);
phonebook people[n];
for (int i = 0; i < n; i++) {
if (scanf("%99s %i", people[i].name, &people[i].number) != 2)
return 1;
}
for (int i = 0; i < n; i++) {
char othername[100];
if (scanf("%99s", othername) != 1)
break;
int j;
for (j = 0; j < n; j++) {
if (strcmp(othername, people[j].name) == 0) {
printf("%s=%i\n", people[i].name, people[i].number);
break;
}
}
if (j == n) {
printf("Not found\n");
}
}
return 0;
}
请注意,将 phone 数字存储为 int
值可能不是一个好主意。最好使用 char
数组,这样初始 0
就很重要并可以存储更长的数字。
我正在编写 HackerRank 30 天代码中的第 8 天,我遇到了 strcmp
的问题。
该代码向用户询问人名及其号码,然后询问其他姓名,如果之前未输入姓名,则输出 Not found
,但如果输入,则输出姓名和他的号码。但由于某种原因,输出仅在 for
语句的最后一个循环中起作用。
代码:
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
typedef struct {
char name[100];
int number;
} phonebook;
int main() {
int n = 0;
do {
scanf("%i", &n);
} while (n < 1 || n > 100000);
int i = 0;
phonebook people[n];
for (i = 0; i < n; i++) {
scanf("%s %i", people[i].name, &people[i].number);
}
char othernames[n][100];
for (i = 0; i < n; i++) {
scanf("%s", othernames[i]);
}
for (i = 0; i < n; i++) {
if (strcmp(othernames[i], people[i].name) == 0) {
printf("%s=%i\n", people[i].name, people[i].number);
} else {
printf("Not found\n");
}
}
return 0;
}
你没有找到othernames
从头到尾每次都比较people
,需要替换
for (i = 0; i < n; i++) {
if (strcmp(othernames[i], people[i].name) == 0) {
printf("%s=%i\n", people[i].name, people[i].number);
}
else {
printf("Not found\n");
}
}
至
bool found = false;
for (i = 0; i < n; i++) {
for ( j = 0 ; j < n ; j++ ) {
if (strcmp(othernames[j], people[i].name) == 0) {
printf("%s=%i\n", people[i].name, people[i].number);
found = true;
}
}
}
if ( found == false ) printf("Not found\n");
问题是 othernames
应该只是 char
的数组,而不是矩阵。对于每个输入的其他名称,您必须扫描整本 phone 书才能找到它或显示 Not found
。按照编码,您只测试输入的第 i 个其他名称是否恰好对应于 phone 书中的第 i 个条目。
这是修改后的版本:
#include <stdio.h>
#include <string.h>
typedef struct {
char name[100];
int number;
} phonebook;
int main() {
int n = 0;
do {
if (scanf("%i", &n) != 1)
return 1;
} while (n < 1 || n > 100000);
phonebook people[n];
for (int i = 0; i < n; i++) {
if (scanf("%99s %i", people[i].name, &people[i].number) != 2)
return 1;
}
for (int i = 0; i < n; i++) {
char othername[100];
if (scanf("%99s", othername) != 1)
break;
int j;
for (j = 0; j < n; j++) {
if (strcmp(othername, people[j].name) == 0) {
printf("%s=%i\n", people[i].name, people[i].number);
break;
}
}
if (j == n) {
printf("Not found\n");
}
}
return 0;
}
请注意,将 phone 数字存储为 int
值可能不是一个好主意。最好使用 char
数组,这样初始 0
就很重要并可以存储更长的数字。