c - 从表示为 char[] 的街道地址解析门牌号

标签 c arrays char

假设我有一个存储为 char[] 的街道地址。有效值示例:

  • 1600 宾夕法尼亚大道
  • 1 个无限循环
  • 贝克街 221 号

如您所见,门牌号可以是任意长度。

在 C 语言中,将门牌号分离为它自己的 int 的有效方法是什么?我想我需要编写一个 while 循环来检查每个字符 c if isdigit(c),但我不知道我在实现方面是否走在正确的轨道上。

最佳答案

您可以使用 strtok 将字符串分解为标记并使用 isdigit() 来确定该标记是否为数字。

#include <string.h>
#include <stdio.h>

int main()
{
   const char str1[80] = "1600 Pennsylvania Ave";
   int houseNumber = 0;
   const char s[2] = " ";
   char *token;

   /* get the first token */
   token = strtok(str, s);

   /* walk through other tokens */
   while( token != NULL ) {
      printf( " %s\n", token );
      if (isdigit(str1[0])) {
           houseNumber = atoi (token);
      }
      token = strtok(NULL, s);
   }

   return(0);
}

或者,您可以使用 sscanf 读取整个字符串并自动解析所有内容:

#include <string.h>
#include <stdio.h>

int main()
{
   const char str1[80] = "1600 Pennsylvania Ave";
   int houseNumber = 0;
   char streetName[50];
   char streetExt[20]; 

   sscanf (str1,"%d %s %s", &houseNumber, streetName, streetExt);

   return(0);
}

最后一种方法取决于字符串的格式在所有情况下都完全相同,这意味着它始终是一个数字后跟 2 个字符串。如果有更多其他内容,strtok 方法将更具容错性。

关于c - 从表示为 char[] 的街道地址解析门牌号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29641055/

相关文章:

c++ - 为什么C++在创建数组时不允许 `new`调用构造函数

C - CS50 pset1 马里奥金字塔挑战

c - 为什么我在 Valgrind 中得到此代码的 "memory error"?

c++ - 初始化并传递数组

arrays - 根据每个矩阵中的数值对矩阵元胞数组进行排序?

C - 删除空格

c++ - 反转字符串 C++

c - 确定两个整数之间的字典距离

c - 类有序访问二叉树上的线性算法

c - 是否有任何函数可以从标准输入中获取无限输入字符串