c - 将电话号码从字母形式转换为数字形式
问题描述
我正在从 KNKings 的书“C 编程:一种现代方法”中做一个练习,其中涉及将用户输入的字母形式的电话号码转换为数字形式。当程序遇到非字母字符(例如数字或标点符号)时,它应该保持它们不变。我可以假设用户只输入大写字母。
但是,至少可以说,我的程序似乎产生了垃圾。
#include <stdio.h>
#define MAX_SIZE 50
int main(void)
{
char alphabetic[MAX_SIZE], ch;
int num_elements = 0;
printf("Enter phone number: ");
int i;
for (i = 0; i < MAX_SIZE && ((ch = getchar()) != '\n'); i++){
alphabetic[i] = ch;
num_elements++;
}
for (i = 0; i <= num_elements; i++){
switch (alphabetic[i]){
case 'A': case 'B': case 'C': alphabetic[i] = '2'; break;
case 'D': case 'E': case 'F': alphabetic[i] = '3'; break;
case 'G': case 'H': case 'I': alphabetic[i] = '4'; break;
case 'J': case 'K': case 'L': alphabetic[i] = '5'; break;
case 'M': case 'N': case 'O': alphabetic[i] = '6'; break;
case 'P': case 'R': case 'S': alphabetic[i] = '7'; break;
case 'T': case 'U': case 'V': alphabetic[i] = '8'; break;
case 'W': case 'X': case 'Y': alphabetic[i] = '9'; break;
default: break;
}
}
printf("%s\n", alphabetic);
return 0;
}
特别是,我输入:COLLECT-800。它输出如下内容: u░@■ ║k ╩</p>
我做错了什么?
解决方案
您的想法是正确的,但是您的程序中缺少两件事:
最重要的是,字符串末尾的空终止符。在
for
您读取数字的循环之后,添加以下行:alphabetic[i] = '\0';
如果用户输入小写字母,它们会在
switch
语句中被忽略。要解决此问题,请将数量从包含<ctype.h>
并更改为。调用已经大写的字母是良性的。switch
alphabetic[i]
toupper(alphabetic[i])
toupper
推荐阅读
- angular - Formly 中的自定义模型
- alsa - 使用 amixer 设置音频使左右不平衡
- python - conda 安装后默认的 jupyter 环境没有意义
- php - xpath 的 php 问题。需要替换xml结构上的一些值
- next.js - 是否可以将 React Admin 应用程序拆分为多个根?
- c# - JwtSecurityTokenHandler ValidateToken:“签名验证失败。没有提供安全密钥来验证签名”
- prometheus - Grafana/Prometheus - 用另一个过滤一个度量
- pip - 无法在 Pycharm 终端中安装 Pytorch,Python 3.10 .win 10
- sql - 我在一个大表上进行了许多相关但单独的查询。我可以以某种方式组合这些并重用一些子查询吗?
- javascript - 通过 JavaScript 捕获 HTML iFrame 屏幕截图问题