C++ #define 替换问题

如果#define x abc ,如果遇到字符串的话比如遇到xy,他会替换成abcy吗?

C++中的#define是预处理器指令,它会把所有在程序中出现的x替换为abc。如果遇到字符串"xy",它只会替换x,不会替换y。所以结果是"abc y"。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/655275
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:C++ #define详解
  • 同时,你还可以查看手册:c语言- #define - # - ## 中的内容
  • 除此之外, 这篇博客: C/C++关于#define的那些奇奇怪怪的用法中的  6 与#define有关联的带“#”号指令 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

            如果你写了那么一个程序,然后想把程序里的intlong long统一,那该怎么办(虽然这样做对程序没有影响)?是把long long全部改成int吗?可这样太麻烦了。

    #include<bits/stdc++.h>
    #define int long long
    #define N 100001
    using namespace std;
    int m,n,ans,cnt=0,sum=0,li,lj,ri,rj,a[250][250];
    void dg(int i,int j)
    {
       	if(i<li)  li=i;
       	if(j<lj)  lj=j;
       	if(i>ri)  ri=i;
       	if(j>rj)  rj=j;
       	ans++;a[i][j]=0;
       	if(a[i][j-1]==1)  dg(i,j-1);
       	if(a[i][j+1]==1)  dg(i,j+1);
       	if(a[i-1][j]==1)  dg(i-1,j);
       	if(a[i+1][j]==1)  dg(i+1,j);  
    }
    void cdr(long long n,long long m)
    {
    	memset(a,-1,sizeof(a));
    	char c;
    	for(long long i=1;i<=n;i++)
    	{
    		for(long long j=1;j<=m;j++)
    		{
    			cin>>c;
    			if(c=='#')  a[i][j]=1;
    		}
    	}
    }
    int main()
    {
    	cin>>n>>m;
    	cdr(n,m);
    	for(long long i=1;i<=n;i++)
    	{
    		for(long long j=1;j<=m;j++)
    		{
              if(a[i][j]==1)
              {
                li=ri=i;lj=rj=j;
    		    ans=0;dg(i,j);
                if((ri-li+1)*(rj-lj+1)==ans)  cnt++;
                else sum++;
              }
            }
        }
        cout<<cnt<<endl<<sum;
        return 0;
    }

            其实,你只需要在函数cdr前面加一句代码就行了:

    #undef int long long

    加上代码后话程序就变成了这样:

    #include<bits/stdc++.h>
    #define int long long
    #define N 100001
    using namespace std;
    int m,n,ans,cnt=0,sum=0,li,lj,ri,rj,a[250][250];
    void dg(int i,int j)
    {
       	if(i<li)  li=i;
       	if(j<lj)  lj=j;
       	if(i>ri)  ri=i;
       	if(j>rj)  rj=j;
       	ans++;a[i][j]=0;
       	if(a[i][j-1]==1)  dg(i,j-1);
       	if(a[i][j+1]==1)  dg(i,j+1);
       	if(a[i-1][j]==1)  dg(i-1,j);
       	if(a[i+1][j]==1)  dg(i+1,j);  
    }
    #undef int long long
    void cdr(long long n,long long m)
    {
    	memset(a,-1,sizeof(a));
    	char c;
    	for(long long i=1;i<=n;i++)
    	{
    		for(long long j=1;j<=m;j++)
    		{
    			cin>>c;
    			if(c=='#')  a[i][j]=1;
    		}
    	}
    }
    int main()
    {
    	cin>>n>>m;
    	cdr(n,m);
    	for(long long i=1;i<=n;i++)
    	{
    		for(long long j=1;j<=m;j++)
    		{
              if(a[i][j]==1)
              {
                li=ri=i;lj=rj=j;
    		    ans=0;dg(i,j);
                if((ri-li+1)*(rj-lj+1)==ans)  cnt++;
                else sum++;
              }
            }
        }
        cout<<cnt<<endl<<sum;
        return 0;
    }

            这便是C/C++中的#undef指令。这样的话,这行代码后面的long long还是用long long表示,与前面的int等价。

            另外,C/C++还有#ifdef,#ifndef,#elif,#if,#endif,#if……#else,#error等与宏定义有关的指令可以供您使用,但入门阶段只需要知道#define就行了。



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^