因此,我使用fgets从文件中获取字符串,然后将它们添加到数组中。但是在将它们添加到数组之前,我要剥离“ \ n”。这就是我的目的
train = 'C:\ProgramData\Anaconda3\animal train'
test = 'C:\ProgramData\Anaconda3\animal test'
lr = 0.001
def label_image(img):
word_label = img.split('.')[-3]
if word_label == "cat": return [1,0]
elif word_label == "dog": return [0,1]
def create_train_data():
training_data = []
for img in tqdm(os.listdir(train)):
label = label_img(img)
path = os.path.join(train,img)
img = cv2.resize(cv2.imread(path,cv2.IMREAD_GRAYSCALE),(50,50))
training_data.append([np.array(img), np.array(label)])
shuffle(training_data)
return(training_data)
数组初始化于 char * array [32];
现在函数可以完美运行了,我可以使用数组,而我不想使用它的元素。但是,每当我尝试打印元素时,它都无法正常工作。
例如,如果strtok(str,"\n");
array[i] = strdup(str);
array[i] = hello
将打印
printf("%s:TEST",array[i]);
但是
:TEST
将打印
printf("%s\n:TEST",array[i]);
我需要将它放在同一行上,所以我不能使用\ n,这只是奇怪的是它仅在其后有新行时才打印。
编辑:不是strdup(strok),而是strdup(str)
编辑: 完整的代码示例:
hello
:TEST
如上所述,array [i]除非后面有'\ n',否则不会打印
编辑:添加了打印功能 文本文件的格式为
char *array[32]
char holder[32]
FILE *fp = fopen("file.txt","r");
int i = 0;
while(fgets(holder, 100, fp)){
strtok(holder,"\n");
array[i] = strdup(holder);
i++;
}
fclose(fp);
printf("word: %s",words[1]);
答案 0 :(得分:0)
C库函数char * strtok(char * str,const char * delim)使用定界符delim将字符串str分成一系列标记。因此,它不是将字符串视为引用而是值的函数。因此,当您执行以下操作时:
strtok(str, "\n");
str将具有与以前相同的值。如果想要第一个标记,例如str值,直到它第一次找到“ \ n”,就必须执行类似的操作。
array[i] = strtok(str, "\n");
或
char *token = strtok(str, "\n");
array[i] = strdup(token);
或类似的东西。
代码:
#include <string.h>
#include <stdio.h>
int main () {
char buff[100];
char *array[32];
FILE *fp = fopen("file.txt","r");
int i = 0;
while(fgets(buff, 100, fp)){
char* token = strtok(buff,"\n");
array[i] = strdup(token);
printf("%s:TEST\n", array[i]);
i++;
}
fclose(fp);
return(0);
}
file.txt
HELLO
BYE
输出:
HELLO:TEST
BYE:TEST
答案 1 :(得分:0)
您在发布的代码片段中有多个问题:
array
在char *array[32]
中未初始化,它只是通过这种方式定义的,并且如果此定义出现在函数体内,则不会初始化。顺便说一句,代码片段中的定义中缺少;
。
holder
的大小为32
,但是您将100
传递给fgets()
导致潜在的缓冲区溢出。
printf("%s:TEST",array[i]);
没有出现在您的代码中,您没有发布有问题的代码。printf("word: %s",words[1]);
使用未定义的对象words
,如果仅输入一个单词,索引1
可能超出范围。您必须发布具有违规行为的实际程序。该代码段与您描述的行为不一致。