我正试图从这样输入的c文件中获取内容:
(0 3 200 3) (0 9 500 3) (98 20 500 3) (100 1 100 3) (100 100 500 3)
atoi和s在括号后的第一个数字(我使用while循环和strcat数字大于一个数字)和任何只有一个数字的数字工作正常,但它们只返回不是数字的第一个数字在括号后面。
以下是该方法的代码:
void allProcesses(FILE file, struct process processArray[]) {
char ch;
int number;
int a, b, c, io;
int arrayCount = 0;
int processIndex = 0;
char temp[1];
while ((ch = fgetc(&file)) != EOF) {
if (isdigit(ch)) {
char numberAppended[20] = "";
while (isdigit(ch)) {
temp[0] = ch;
strcat(numberAppended, temp);
ch = fgetc(&file);
}
char* end;
number = (int)strtol(numberAppended, &end, 0);
printf("The number is %d\n",number);
int atoinum = atoi(numberAppended);
switch (processIndex) {
case 0:
a = number;
if (DEBUG == TRUE) {
printf("a = %c\n", a);
printf("NUmber a is %d\n", a);
}
processIndex++;
break;
case 1:
b = number;
if (DEBUG == TRUE) {
printf("b = %c\n", b);
printf("NUmber b is %d\n", b);
}
processIndex++;
break;
case 2:
c = number;
if (DEBUG == TRUE) {
printf("c = %c\n", c);
printf("NUmber c is %d\n", c);
}
processIndex++;
break;
case 3:
io = number;
if (DEBUG == TRUE) {
printf("io = %c\n", io);
printf("NUmber io is %d\n", io);
}
processIndex++;
break;
default:
break;
}
}
if (ch == ')') {
processArray[arrayCount] = makeProcess(a, b, c, io);
arrayCount++;
processIndex = 0;
}
}
}
答案 0 :(得分:1)
首先(阅读评论):
根据您的代码,您已声明char temp[1];
一个大小为2
的大小(否则未定义的行为,因为内存溢出):
char temp[2];
while (isdigit(ch)) { // from `(` to `)`
temp[0] = ch; // should be a null terminated
temp[1] = '\0'; // add this step;
strcat(numberAppended, temp);
ch = fgetc(&file);
}
第二::您的numberAppended
正在解析为一种类型:"0 9 500 3"
你正在打电话
number = (int)strtol(numberAppended, &end, 0);
^
output argument
strtol的语法:
long int strtol(const char *numberAppended, char **end, int base);
在哪里
numberAppended
:是要转换为长整数的字符串。 end
:指向指针,该指针将在字符串“numberAppended
”中的长整数后面立即设置为字符。 你要写这样的东西:( 读评论)
end = numberAppended; // assign to first string
// in a loop {
number = (int)strtol(end, &end, 0); // in loop end is input &end is output
printf("The number is %d\n",number);
//}
我的以下代码将帮助您了解如何使用strtol()
从numberAppended
字符串中解析和提取数字:
#include <stdio.h> /* printf */
#include <stdlib.h> /* strtol */
int main (){
char numberAppended[] = "2001 11 223 444 566";
char * end;
long int li;
end =numberAppended;
int base =10;
int ele = 0;
while(li=strtol (end, &end, base)){
printf("%ld \n", li);
ele += 1;
}
printf("\nNo of elements: %d", ele);
return 0;
}
输出:
2001
11
223
444
566
No of elements: 5
第三:可能不是错误但我在processIndex
之前找不到代码中switch(){}
更新的位置..