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;
}