仅包含字母的字符串 - 没有工作

时间:2018-04-27 05:32:54

标签: c if-statement

我需要编码一个术语,告诉我"矩阵名称"有效或无效。

名称应仅包含大小字母。 但问题是,它的条件是"如果"总是告诉我name is invalid,虽然不是。{

请帮我弄清楚我做错了什么。

以下是代码:

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

void main() {    
    int i; 
    char mtx1[10];

    gets_s(mtx1_name, sizeof(mtx1_name));
    for (i = 0; i < sizeof(mtx1_name); i++)

        if ((mtx1_name[i]<'a' || mtx1_name[i]>'z') && (mtx1_name[i]<'A' || mtx1_name[i]>'Z') && mtx1_name[i]!='\0')
        {
            printf_s("Eroor: '%s' - illegal variable name! \n", mtx1_name);
            i = sizeof(mtx1_name);
        }
} 

可以找到代码图像的链接

enter image description here

1 个答案:

答案 0 :(得分:3)

多个问题:

  • main的原型不是void main()
  • 数组名称应为mtx1_name,而不是mtx1
  • 测试gets_s()
  • 的返回值
  • 将循环停止在数组中C字符串的末尾,否则您将访问未定义行为的未初始化部分。
  • 最好使用<ctype.h>
  • 中的功能检查字母
  • 如果您坚持使用适用于ASCII的显式比较,请使用更易读的比较集。不要担心性能,编译器可能会生成相同的代码,但代码将更容易被下一个读者理解

以下是修改后的版本:

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

int main() {
    char mtx1_name[100];

    if (gets_s(mtx1_name, sizeof mtx1_name)) {
        for (int i = 0; mtx1_name[i]; i++) {
            if (!((mtx1_name[i] >= 'a' && mtx1_name[i] <= 'z') ||
                  (mtx1_name[i] >= 'A' && mtx1_name[i] <= 'Z'))) {
                printf_s("Error: '%s' - illegal variable name! \n", mtx1_name);
                break;
            }
        }
    }
    return 0;
} 

这是一个更便携的版本:

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

int main() {
    char mtx1_name[100];

    if (gets_s(mtx1_name, sizeof mtx1_name)) {
        for (int i = 0; mtx1_name[i]; i++) {
            if (!isalpha((unsigned char)mtx1_name[i])) {
                printf_s("Error: '%s' - illegal variable name!\n", mtx1_name);
                break;
            }
        }
    }
    return 0;
}