Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C:在数组中搜索非数字字符_C_Arrays_Character - Fatal编程技术网

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

C:在数组中搜索非数字字符,c,arrays,character,C,Arrays,Character,我正在构建一个C程序,它获取一个.txt文件作为参数。在.txt中,有几行整数,它们之间有一个空格,如下所示: 1 2 3 4 5 6 7 8 ... 1 2 a 4 ... 我应该知道,如果.txt文件中出现非整数字符,如下所示: 1 2 3 4 5 6 7 8 ... 1 2 a 4 ... 因为C中没有instanceof运算符,所以我使用一个数组,其中包含0-9之间的数字,并检查.txt文件的每个字符,如果它是空格或整数。如果两者都不是,程序应该退出。 如果文件中没有问题,程序将

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

1 2 3 4
5 6 7 8
...
1 2 a 4
...
我应该知道,如果.txt文件中出现非整数字符,如下所示:

1 2 3 4
5 6 7 8
...
1 2 a 4
...
因为C中没有instanceof运算符,所以我使用一个数组,其中包含0-9之间的数字,并检查.txt文件的每个字符,如果它是空格或整数。如果两者都不是,程序应该退出。 如果文件中没有问题,程序将计算一个中值并将该行打印到标准输出。 这是我的代码:

#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;
}
#包括
#包括
int数组内容(字符值);
int main(int argc,字符**argv){
常量int LINESIZE=255;
如果(argc!=2){
printf(“错误的参数!”);
返回-1;
}
char*command1=argv[1];
文件*handle=fopen(command1,“r”);
如果(!句柄){
printf(“未找到文件!”);
返回-1;
}
整数计数=0;
整数和=0;
整数中值;
字符字符串[行大小];
while(fgets(字符串、线宽、句柄)!=NULL){

对于(inti=0;i您应该真正检查
isdigit
C函数

#include <ctype.h>

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

    return 1;
}

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

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

for (int i = 0; string[i] != '\0' && string[i] != '\n'; i++) {
    ...
}
C中的字符串只是内存的一部分,它就像一个数组,获取长度的唯一方法是找到结尾('\0')

我还建议您直接搜索ASCII表。字符只是介于0和127之间的数字。数字介于48和57之间,一个简单的条件就可以了

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

我似乎已经解决了这个问题:

#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);
}
#包括
#包括
int数组内容(字符值);
int main(int argc,字符**argv){
常量int LINESIZE=255;
如果(argc!=2){
printf(“错误的参数!”);
返回-1;
}
char*command1=argv[1];
文件*handle=fopen(command1,“r”);
如果(!句柄){
printf(“未找到文件!”);
返回-1;
}
整数计数=0;
整数和=0;
整数中值;
字符字符串[行大小];
while(fgets(字符串、线宽、句柄)!=NULL){

对于(inti=0;i,您的代码有几个问题

此位匹配空格,但会导致跳过以下字符,因为循环也会执行
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);
}

i
string[i];
不相关,但没有“非整数字符”,但有“非数字字符”。这并不能解决arrayConsains返回值问题您不需要arrayContains,正如Krzysztof Szewczyk所说,您可以使用isDigit或使用Ascii表
(string[i]>121&&string[i]<112)
永远不可能true@ChrisTurner我想可以。@KrzysztofSzewczyk什么数字大于121,但也小于112?;)该死,它更短了!Op的解决方案实际上效率低下,而且总体来说还不错!我看不出你的
arrayContains
和for loopOK的Op.2部分之间有什么显著的区别,但这并不重要,也不是更好,也不是更糟,只是不同而已。好吧,现在
arrayContains
真的毫无意义,为什么不呢t call
isdigit
?而且名称
arrayContains
无论如何都是误导性的。但是你还是在空格后跳过字符是的,我跳过空格字符是因为我对它们不感兴趣。我只想处理整数否,我的意思是你跳过空格…然后是因为您正在做一个额外的
i++