删除新行时不显示字符串

时间:2019-03-15 17:01:09

标签: c

因此,我使用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]);

2 个答案:

答案 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)

您在发布的代码片段中有多个问题:

  • arraychar *array[32]中未初始化,它只是通过这种方式定义的,并且如果此定义出现在函数体内,则不会初始化。顺便说一句,代码片段中的定​​义中缺少;

  • holder的大小为32,但是您将100传递给fgets()导致潜在的缓冲区溢出。

  • printf("%s:TEST",array[i]);没有出现在您的代码中,您没有发布有问题的代码。
  • 最终输出printf("word: %s",words[1]);使用未定义的对象words,如果仅输入一个单词,索引1可能超出范围。

您必须发布具有违规行为的实际程序。该代码段与您描述的行为不一致。