C:在数组中搜索非数字字符

时间:2017-10-25 13:50:50

标签: c arrays character

我正在构建一个C程序,它将.txt文件作为参数。在.txt内部有整数行,在它们之间有一个空格,如下所示:

1 2 3 4
5 6 7 8
...

我应该知道,如果.txt文件中出现非整数字符,就像这样:

1 2 a 4
...

由于C中没有instanceof运算符,我使用一个包含0-9数字的数组,并检查.txt文件的每个字符,如果它是空格或整数。如果不是,程序应该退出。 如果文件中没有问题,程序将计算中值并将该行打印到stdout。 这是我的代码:

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

int arrayContains(char value);

int main(int argc, char **argv) {
    const int LINESIZE = 255;
    if (argc != 2) {
        printf("wrong args!");
        return -1;
    }
    char *command1 = argv[1];
    FILE *handle = fopen(command1, "r");
    if (!handle) {
        printf("file not found!");
        return -1;
    }
    int count = 0;
    int sum = 0;
    int median;
    char string[LINESIZE];
    while (fgets(string, LINESIZE, handle) != NULL) {
        for (int i = 0; i <= sizeof(string) / sizeof(string[0]) - 1; i++) {
            printf("%c", string[i]);
            if (string[i] == ' ') {
                i++;
            }
            else if (arrayContains(string[i]) == 0) {
                count++;
                sum += (int)string[i];
            }
            else {
                printf("non-integer-character found!\n");
                return -1;
            }
        }
        median = sum / count;
        printf("%s\n", string);
        printf("%d\n", median);
    }
}

int arrayContains(char value) {
    const char numbers[10] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
    for (int i = 0; i <= 9; i++) {
        if (numbers[i] == value) {
            return 0;
        }
    }
    return -1;
}

现在程序的输出始终是txt文件的第一个数字,紧接着是:“找到非整数字符!”。 这告诉我,来自gets()的字符串元素与来自arrayContains()函数内的常量“numbers”数组的元素之间的比较将始终导致从arrayContains()函数返回-1。 我做错了什么?

4 个答案:

答案 0 :(得分:2)

你应该看看isdigit C函数!

#include <ctype.h>

int hasDigit(const char *s)
{
    while (*s) {
        if (isdigit(*s++) == 0) return 0;
    }

    return 1;
}

上面的代码在空字符串上返回1。小心!您可以使用我的功能而不是arrayContains。如果您想使用您的日常工作,请查看我的&#34;版本&#34;:

int arrayContains(char value) {
    return isdigit(value)?0:-1;
}

答案 1 :(得分:1)

您的代码存在一些问题。

此位与空格匹配,但会导致您跳过以下字符,因为您的循环也会i++

if (string[i] == ' ') {
    i++;
}

这不是将数字转换为数字的正确方法。你在这里得到的是字符的ASCII值而不是数字的值。因此,例如,如果你有一个'1',那么你将加49而不是1。

sum += (int)string[i];

正如其他地方所讨论的,你最好使用isdigit()来识别你是否有数字字符。您还可以使用isspace()进行测试以查看是否有空格或'\ n'字符(它涵盖所有空格)。这会使你的循环语句变得不那么复杂,因为你可以处理整个字符串并轻松处理长度大于缓冲区大小的行。

此代码可以解决您遇到的问题

while (fgets(string, LINESIZE, handle) != NULL) {
    for (char *pos=string; *pos!='\0'; pos++) {
        printf("%c", *pos);
        if (isdigit(*pos)) {
            count++;
            sum += *pos-'0';
        } elseif(!isspace(*pos)) {
            printf("non-integer-character found!\n");
            return -1;
        }
    }
    median = sum / count;
    printf("%s\n", string);
    printf("%d\n", median);
}

答案 2 :(得分:0)

我似乎已经解决了它:

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

int arrayContains(char value);

int main(int argc, char **argv) {
    const int LINESIZE = 255;
    if (argc != 2) {
        printf("wrong args!");
        return -1;
    }
    char *command1 = argv[1];
    FILE *handle = fopen(command1, "r");
    if (!handle) {
        printf("file not found!");
        return -1;
    }
    int count = 0;
    int sum = 0;
    int median;
    char string[LINESIZE];
    while (fgets(string, LINESIZE, handle) != NULL) {
        for (int i = 0; i <= sizeof(string) / sizeof(string[0]) - 1; i++) {
            printf("%c\n", string[i]);
            if (isspace(string[i]) == 0) {
                i++;
            }
            else if (isdigit(string[i]) == 0) {
                count++;
                sum += (int)string[i];
            }
            else {
                printf("non-integer-character found!\n");
                return -1;
            }
        }
        fgets(string, LINESIZE, handle);
    }
    median = sum / count;
    printf("%s\n", string);
    printf("%d\n", median);
}

现在有点像预期的那样工作。

答案 3 :(得分:-1)

使用运算符sizeof(),它不会返回String的长度但是指针的内存大小(size_t为8个字节)。

我建议您将此用于for循环:

for (int i = 0; string[i] != '\0' && string[i] != '\n'; i++) {
    ...
}

C中的字符串只是内存的一部分,它就像和数组一样,获取长度的唯一方法就是找到结尾(&#39; \ 0&#39;)

我还建议你直接搜索ASCII表。字符只是0到127之间的数字。数字在48到57之间,这是一个简单的条件!

if (string[i] <= 48 && string[i] >= 57) {
    ...
}