C - 如何比较扩展字符序列与函数 strcmp()?
C - How to compare extended char sequence with function strcmp()?
我需要比较字符串是否等于文本文件中的以下扩展字符序列:“————”(ALT + 0151 代码重复三次)。如何使用函数 strcmp() 来完成?
一段示例文本文件(TSV):
皮拉西卡巴大道。 Armando Salles de Oliveira Lado 标准杆 13400-005 Centro
皮拉西卡巴电视台。 Agostinho Frasson ——— 13400-008 Centro
皮拉西卡巴大道Armando Salles de Oliveira Lado ímpar 13400-010 Centro
当我读取文件并打印字段时,显示器上显示“ùùù”。
结构:
typedef struct {
char cidade[50];
char tipoLogradouro[20];
char logradouro[50];
char trecho[30];
char cep[10];
char bairro[50];
} Endereco;
测试在'switch case'里面,程序在这部分崩溃:
case 3:
{
if(strcmp(token, "———") == 0) // Change to "ùùù" and fails too.
strcpy(registro[i].trecho, NULL);
else
strcpy(registro[i].trecho, token);
break;
}
非常感谢。
strcmp 仅在 null 时失败,你几乎可以做到
if (strcmp(inputString,"———")==0){
printf("Strings Equal\n")
} else{
printf("Strings unequal")
}
如果您只想查看字符串是否在较大的字符串中,strstr 是您要查找的函数,而不是 strcmp。
strcpy
一件事和一件事 只有 ,那就是将一个字符串复制到另一个字符串。如果你给它NULL
,那不是一个字符串,取消引用一个 NULL 指针会导致崩溃。
你要的是这个:
if (strcmp(token, "———") == 0)
// Assign NULL pointer
registro[i].trecho = NULL;
else
// Copy string to buffer
strcpy(registro[i].trecho, token);
记住 strcpy
是一个非常冒险的函数,因为它假设了很多关于目标缓冲区的事情。如果 trecho
不够大,无法容纳 token
字符串, 包括 NULL 终止符 ,您将得到未定义的行为。如果 token
没有正确地以 NULL 终止,你会得到未定义的行为。这个看似无害的代码有很多方法可以失控。
通常在C中,你只能在带引号的字符串中使用7位ASCII,所以对于高位ASCII你需要使用\x转义序列和字符的十六进制代码。因此,在您的情况下,您可以键入:“\x97\x97\x97”,因为 97 是十六进制表示 151 十进制。
case 3:
{
if(strcmp(token, "\x97\x97\x97") == 0)
strcpy(registro[i].trecho, NULL);
else
strcpy(registro[i].trecho, token);
break;
}
我需要比较字符串是否等于文本文件中的以下扩展字符序列:“————”(ALT + 0151 代码重复三次)。如何使用函数 strcmp() 来完成?
一段示例文本文件(TSV):
皮拉西卡巴大道。 Armando Salles de Oliveira Lado 标准杆 13400-005 Centro 皮拉西卡巴电视台。 Agostinho Frasson ——— 13400-008 Centro 皮拉西卡巴大道Armando Salles de Oliveira Lado ímpar 13400-010 Centro
当我读取文件并打印字段时,显示器上显示“ùùù”。
结构:
typedef struct {
char cidade[50];
char tipoLogradouro[20];
char logradouro[50];
char trecho[30];
char cep[10];
char bairro[50];
} Endereco;
测试在'switch case'里面,程序在这部分崩溃:
case 3:
{
if(strcmp(token, "———") == 0) // Change to "ùùù" and fails too.
strcpy(registro[i].trecho, NULL);
else
strcpy(registro[i].trecho, token);
break;
}
非常感谢。
strcmp 仅在 null 时失败,你几乎可以做到
if (strcmp(inputString,"———")==0){
printf("Strings Equal\n")
} else{
printf("Strings unequal")
}
如果您只想查看字符串是否在较大的字符串中,strstr 是您要查找的函数,而不是 strcmp。
strcpy
一件事和一件事 只有 ,那就是将一个字符串复制到另一个字符串。如果你给它NULL
,那不是一个字符串,取消引用一个 NULL 指针会导致崩溃。
你要的是这个:
if (strcmp(token, "———") == 0)
// Assign NULL pointer
registro[i].trecho = NULL;
else
// Copy string to buffer
strcpy(registro[i].trecho, token);
记住 strcpy
是一个非常冒险的函数,因为它假设了很多关于目标缓冲区的事情。如果 trecho
不够大,无法容纳 token
字符串, 包括 NULL 终止符 ,您将得到未定义的行为。如果 token
没有正确地以 NULL 终止,你会得到未定义的行为。这个看似无害的代码有很多方法可以失控。
通常在C中,你只能在带引号的字符串中使用7位ASCII,所以对于高位ASCII你需要使用\x转义序列和字符的十六进制代码。因此,在您的情况下,您可以键入:“\x97\x97\x97”,因为 97 是十六进制表示 151 十进制。
case 3:
{
if(strcmp(token, "\x97\x97\x97") == 0)
strcpy(registro[i].trecho, NULL);
else
strcpy(registro[i].trecho, token);
break;
}