私はCに不慣れで、いくつかのことを学ぼうとしています。私がやろうとしているのは、ファイルを読み込んで情報を保存することです。フォーマットはCSVとなるため、各文字を読み込み、数字かカンマかを判断し、リンクリストに格納する予定です。私が抱えている問題は、次の例のように1文字以上の数字を読み取ることです。
5,2,24,5
これが私がこれまでに得たコードであり、それは私が期待する出力を返さないだけです。これがコードで、出力はコードサンプルの下にあります。
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
struct list {
float value;
struct list * next;
struct list * prev;
};
int main( int argc, char *argv[] ){
FILE *infile;
char *token = NULL;
char my_char;
/* Open the file. */
// The file name should be in argv[1]
if((infile = fopen(argv[1], "r")) == NULL) {
printf("Error Opening File.\n");
printf("ERROR: %s\n", strerror(errno));
exit(1);
}
while((my_char = (char)fgetc(infile)) != EOF){
//Is my_char a number?
if(isdigit(my_char)){
if(token == NULL){
token = (char *)malloc(sizeof(char));
memset(token, '\0', 1);
strcpy(token, &my_char);
printf("length of token -> %d\n", strlen(token));
printf("%c\n", *token);
} else {
token = (char *)realloc(token, sizeof(token) + 1);
strcat(token, &my_char);
printf("%s\n", token);
}
}
}
free(token);
fclose(infile);
}
そしてここに出力があります:
[estest@THEcomputer KernelFunctions]$ nvcc linear_kernel.cu -o linear_kernel.exe
[estest@THEcomputer KernelFunctions]$ ./linear_kernel.exe iris.csv
length of token -> 5
5
5a#1a#
5a#1a#3a#
5a#1a#3a#5a#
5a#1a#3a#5a#1a#
5a#1a#3a#5a#1a#4a#
*** glibc detected *** ./linear_kernel.exe: realloc(): invalid next size: 0x0000000001236350 ***
トークンの長さが1であると予想されるのに、なぜトークンの長さが「5」であり、5に続く奇妙な文字(「a#」で表される)であるのかわかりません。誰かが私がこれをもう少しよく理解するのを手伝ってもらえますか?