C:在数组中搜索非数字字符
我正在构建一个C程序,它获取一个.txt文件作为参数。在.txt中,有几行整数,它们之间有一个空格,如下所示: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文件的每个字符,如果它是空格或整数。如果两者都不是,程序应该退出。 如果文件中没有问题,程序将
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);
}
istring[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 callisdigit
?而且名称arrayContains
无论如何都是误导性的。但是你还是在空格后跳过字符是的,我跳过空格字符是因为我对它们不感兴趣。我只想处理整数否,我的意思是你跳过空格…然后是因为您正在做一个额外的i++