调用函数的未定义变量

时间:2014-03-23 12:28:27

标签: c

我正在尝试创建此程序:

#include <stdio.h>

void suffix(char str[], char c);

int main()
{
   char ch;
   char str[100] ="abcdefgabcd";
   ch=c;
   suffix(str,ch);

   return 0;
}

void suffix(char str[], char c)
{
    int length;
    int i;
    int j;
    int counter=0;


    for (length=0; str[length]!='\0';)
    { 
        length++;
    }


    for(i=0;i<length;i++)
    {
        if(str[i]==c)
        {
           counter++;
           /* print */
           for(j=i; j<length;j++)
           {
              printf("%s",str[j]);
           }
           printf("\n");
        }  
     } 

我想在mainsuffix函数之间建立链接,因此我将参数数据类型添加为变量c
现在在main程序中,我必须将后缀与参数链接,因此我创建了一个名为ch的变量,该变量将c的值存储在后缀上。
现在,要做到这一点,我必须在main上调用后缀,但我必须用它的参数调用它(否则我会得到too few arguments in function call)。
但是,如果我想调用后缀,我必须在c中存储ch,但我不能这样做,因为main不知道后缀。
这是一个“拖延的问题”,我无法做到各方面,因为每个方面都有错误 我怎么解决这个问题?

提前谢谢。

2 个答案:

答案 0 :(得分:1)

C中的参数不能被子程序修改,但您可以提供这些参数的地址;子程序可以修改提供的地址的内存。这被称为“指针”,它是一个无法在堆栈溢出帖子中充分教授的主题。

总结一下如何在这种情况下使用指针,你可以将子程序的调用签名更改为:void suffix(char str[], char *c)(注意c变量旁边的*);您可以将main中的来电更改为:suffix(str, &ch);(发送ch变量的地址),并在{{更改c变量的所有用途1}}为suffix(而不是查看*c,您现在正在查看c指向的内容。

这个主题过于复杂而无法从帖子中学习的原因之一是:指针在误用时很危险,当你不知道自己是什么时很容易误用它们这样做!滥用指针可能会导致程序崩溃,有时候原因不明显,并且可能导致程序中的其他数据以您不想要的方式更改(这可能会间接导致崩溃,或者只是导致错误的结果)

c

答案 1 :(得分:0)

为什么不使用string.h,它是标准的 strcat()完全符合您的要求。

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

int main(int argc, char **argv) {
  char str1[13] = "abcdef";
  char str2[7] = "uvwxyz";
  strcat(str1, str2);
  printf("%s\n", str1);
  return 0;
}