Как мне назначить переменную в цикле for в C? - PullRequest
1 голос
/ 23 марта 2019

Нуб, работает над проблемой шифрования, и я хочу перебрать комбинации в массиве в C, то есть aaa, aab, aac, aba и т. Д., А затем передать каждую комбинацию в функцию (чтобы проверить, является ли эта комбинация правильный код).

Я могу напечатать то, что хочу, без проблем, то есть aa, ab, ba, bb, но не могу получить эти значения в моей временной переменной.

#include <stdio.h>

int main(void) {
    char *word = "ab";

    char * temp[3];
    //temp[2] = '\0'; 

    for (int i = 0; i < 2; i++){
        for (int j = 0; j < 2; j++){
            temp[0] = &word[i];
            temp[1] = &word[j];
            printf("%s\n", *temp);
            // printf("%c", word[i]);
            // printf("%c\n", word[j]);
            // pass_temp_to_function(temp);
        }
    }

    return 0;
}

Я получаю ab, ab, b, b, когда я должен получить aa, ab, ba, bb (с моим приведенным выше кодом), и не знаю, почему, как это исправить или как-то иначе найти ответ отсюда мой нубишский вопрос.

Ответы [ 4 ]

2 голосов
/ 23 марта 2019

Я бы порекомендовал, чтобы в 5-й главе Кернигана и Ричи * был рассмотрен оригинальный постер. .

/* main.c - This is a novice program. */
/* Copyright (C) 2019 Robin Miyagi https://www.linuxprogramming.ca/
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

#ifndef _GNU_SOURCE
# define _GNU_SOURCE
#endif
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
#include <error.h>

/*
 * Declared global so that the linker can find it.....................
 */
int main (void);

/*
 * Implementation.....................................................
 */
int
main
(void)
{
  char temp[3];
  int i;
  int j;

  temp[2] = '\0';
  for (i = 0; i < 2; ++i)
    for (j = 0; j < 2; j++)
      {
        temp[0] = 'a' + i;
        temp[1] = 'a' + j;
        printf ("%s\n", temp);  /* temp ---> beginning of array of char. */
      }
  return EXIT_SUCCESS;
}
2 голосов
/ 23 марта 2019

Похоже, что вы тщательно его кодировали, чтобы создать нулевые предупреждения, даже если это очень неправильно, со всевозможными массивами строк и указателями на символы, которыми обтекаются.

Вы хотите иметь одну строку из 2 символов, для этого достаточно массива из 3 символов:

char temp[3];
temp[2] = '\0'; 

...
    temp[0] = word[i];
    temp[1] = word[j];

    puts(temp); // less typing but essentially the same as printf("%s\n", temp);
0 голосов
/ 23 марта 2019

С помощью приведенной выше справки я смог заставить свой код работать следующим образом:

#include <stdio.h>
#include <string.h>

int main(void) {

    char * word = "abc";

    char temp[3];
    temp[2] = '\0';

    for (int i = 0; i < strlen(word); i++){
        for (int j = 0; j < strlen(word); j++){
            temp[0] = word[i];
            temp[1] = word[j];
            puts(temp);
        }
    }
    printf("%s", temp);

    return 0;
}

// отображает aa, ab, ac, ba, bb, bc, ca, cb, cc, cc (дубликаты)

0 голосов
/ 23 марта 2019

temp - указатель на указатель на char.Я не знаю, почему ваш код построен так, как он есть, поэтому я просто собираюсь предположить, что есть причина.

            // printf("%c", word[i]);
            // printf("%c\n", word[j]);

Да, эти строки не работали.Небольшая ошибкаЛегкое исправление:

            printf("%c", temp[i][0]);
            printf("%c\n", temp[j][0]);

Нам нужно снова разыменовать char*, чтобы вернуться к char.Я мог бы написать *(temp[i]), но temp[i][0] легче читать.

...