我正在构建一个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。 我做错了什么?
答案 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) {
...
}