【问题标题】:Dynamic variables in CC中的动态变量
【发布时间】:2016-04-30 03:04:54
【问题描述】:

我想在我的程序中使用双组动态变量。我发现了类似的问题,Is it possible to use a for loop to change a variable name in C?

我可以用它做类似的例子

for (str[run] = 0 ; str[run] < 5 ; str[run]++)

来自另一个问题,但在我的示例中不起作用。

我有更高级的版本,因为我一次使用两组动态变量。我知道我们可以在 for 循环中放置尽可能多的变量,使用逗号,但即使有两个,它也会看起来很长而且不好看。所以我试着走不同的路。

我想要的是第一次使用 str1chr1

str2chr2 第二次以此类推。

这是我的代码:

int main () {

    int run;                            //loop counter

    char str1[20] = "abracadabra";      //string #1
    ...

    char chr1 = 'a';                    //character #1
    ...

    for (run; run <= 5; run++)          // runs 5 times
    {
        printf("The string %c will be removed from %c characters. \n", str[run], chr[run]);
        rmchr(str[run], chr[run]);
        printf("New modified string is: %c \n\n", str[run]);
    }
    ...
}

我知道我的代码是错误的,但我知道我非常接近事实 :-) 如果它有用,我也包括在内

#include <string.h> 

在我的主要功能之前。

这是我的完整程序:

/*
* A simple program to remove certain characters from the given strings                              
*/

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

int main () {

    int run;                            //loop counter

    char str1[20] = "abracadabra";      //string #1
    char str2[20] = "abracadabra";      //string #2
    char str3[20] = "abracadabra";      //string #3
    char str4[20] = "aaaa";             //string #4
    char str5[20] = "aaaa";             //string #5

    char chr1 = 'a';                    //character #1
    char chr2 = 'b';                    //character #2
    char chr3 = 'n';                    //character #3
    char chr4 = 'a';                    //character #4
    char chr5 = 'n';                    //character #5

    //remove certain characters from array
    void rmchr(char str[], char ch);    //rmchr stands for 'remove character'

    for (run; run <= 5; run++)          // runs 5 times
    {
        printf("The string %c will be removed from %c characters. \n", str[run], chr[run]);
        rmchr(str[run], chr[run]);
        printf("New modified string is: %c \n\n", str[run]);
    }

    return 0;
}

void rmchr(char str[], char chr)
{
   int i, j = 0;                        //loop counters
   int length;                          //length of array

   length = strlen(str);

   for (i = 0; i < length; i++) {
      if (str[i] != chr) {
         chr = str[i];
         str[j] = chr;
         j++;
      }
   }
   str[j] = '\0';
}

一个程序的最终版本,它运行完美并得到了我的老师的认可:

/*
* A simple program to remove certain characters from the given strings                              
*/

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

int main () {

    // print array before and after editing array
    void print_rmchr (char str[], char ch); 

    int run;                            //loop counter

    char str1[20] = "abracadabra";      //string #1
    char str2[20] = "abracadabra";      //string #2
    char str3[20] = "abracadabra";      //string #3
    char str4[20] = "aaaa";             //string #4
    char str5[20] = "aaaa";             //string #5

    char chr1 = 'a';                    //character #1
    char chr2 = 'b';                    //character #2
    char chr3 = 'n';                    //character #3
    char chr4 = 'a';                    //character #4
    char chr5 = 'n';                    //character #5

    print_rmchr(str1, chr1);
    print_rmchr(str2, chr2);
    print_rmchr(str3, chr3);
    print_rmchr(str4, chr4);
    print_rmchr(str5, chr5);

    return 0;
}

//remove certain characters from array
void rmchr(char str[], char ch) {
   int i, j = 0;    //loop variable
   int size;        //lengh 
   char new_str[20];    //new array

   size = strlen(str);

   for (i = 0; i < size; i++) {
      if (str[i] != ch) {
         new_str[j] = str[i];
         j++;
      }
   }
   new_str[j] = '\0';

   strcpy(str, new_str);

}

// print array before and after editing array
void print_rmchr (char str[], char ch){

    //remove certain characters from array
    void rmchr(char str[], char ch);

    printf("The string '%s' will be removed from '%c' characters. \n\n", str, ch);

    rmchr(str, ch);

    printf("New modified string is: '%s'. \n\n", str);
}

    /* In case you will need user input:
    //USER INPUT
    printf("Enter the string : \n");
    gets(str);

    printf("Enter character which you want to delete : \n");
    scanf("%ch", &ch);

    print_rmchr(str, ch);
    */

【问题讨论】:

  • 您确定run 已在您的... 部分中初始化吗?
  • "我想要的是第一次使用 str1 和 chr1。第二次使用 str2 和 chr2 等等。"我猜你不能这样做,因为典型的系统不会在可执行文件中保存变量名,除了用于调试的信息。为什么不使用数组?
  • MikeCAT,我必须使用字符串,这是我作业的一部分。在我的 ... 部分只是从 str1 到 str 5 以及从 chr1 到 chr5 等等。没什么特别的。
  • 为什么不是指向字符串的指针数组?
  • 使用字符串不会和使用数组冲突。或者“字符串”在你的课堂上有什么特殊含义吗?

标签: c


【解决方案1】:

你只是要一个数组吗? C 可以很好地处理数组的数组:

char str[5][20] = { 
    "abracadabra",      //string #0
    "another string",   //string #1
    ...
};

char chr[5] = { 'a', 'b', 'c', 'd', 'e' };  // 5 chars, #0 throuh #4

【讨论】:

  • 我不确定你在这里的意思,但它看起来很有用。我已经在问题的末尾发布了我的完整版本,以便更清楚地了解我想要什么。
【解决方案2】:

你需要的是这样的:

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

#define MAX_COUNT 5

int main () {

        int i;
        int run = 0;                            //loop counter
        char *str[MAX_COUNT];
        char str_const[MAX_COUNT][20] = {
                "abracadabra", "something", "more", "new", "old",
        };
        const char chr[MAX_COUNT] = {'a', 'e', 'r', 'e', 'd'};

        for (i = 0; i < MAX_COUNT; i++) {
                str[i] = malloc(strlen(str_const[i]) + 1);
                strcpy(str[i], str_const[i]);
        }

        for (run = 0; run < MAX_COUNT; run++)  {         // runs 5 times
                printf("The string %s will be removed from %c characters. \n", str[run], chr[run]);
                rmchr(str[run], chr[run]);
                printf("New modified string is: %s \n\n", str[run]);
        }

 return 0;

所以这里是解释: 您需要一个 chr 数组,它基本上是您需要的字符数组。但是,str 需要是一个指向字符的指针数组。所以 str 数组将只保存字符串的地址,然后您可以根据需要使用该地址访问字符串。希望对您有所帮助。

【讨论】:

  • 这个程序似乎无效。字符串文字不能修改。
  • 当我编辑我的代码时,使用你的修改,编译器让我运行,但很快就刹车——这比我的早期版本好得多(我的版本甚至不允许我编译):-) .但还是有些地方不太对劲。
  • @MikeCAT:没错。我没有仔细阅读该功能。它似乎正在删除角色。
  • @Mikhail:是的,它会崩溃,因为您将尝试编辑字符串文字。您需要为它分配内存,然后对其进行编辑。让我更正一下解决方案。
猜你喜欢
  • 1970-01-01
  • 2013-02-18
  • 1970-01-01
  • 1970-01-01
  • 2015-06-09
  • 2012-10-14
  • 2018-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多