用指针影响字符串[关闭]

Posted

技术标签:

【中文标题】用指针影响字符串[关闭]【英文标题】:impacting Strings with pointers [closed] 【发布时间】:2018-06-11 14:57:57 【问题描述】:

不工作的代码。在用户初始化变量后的函数main 中,它转到if 部分,然后发生崩溃。该程序的目标是影响字符串中的重复字符。所以我决定在函数f1中有一个指针,指针应该指向数组0th的字符kar[] 然后将0th char1st char 进行比较,但程序恰好在最后一个scanf("%s",kar[1000]). 之后崩溃 问题出在哪里?

#include <stdio.h>
char f1(char* p)

    int i=0,c=1;
    while(*(p+i))
    
        if(*p==*(++p))
        
            c+=1;
            p++;
            i++;
            continue;           
        
        else
        
            if(c>1)
            
                printf("%c%d",*p,c);
            
            else
            
                printf("%c",*p);
            
        
    i++;
    




int main()

    int n,i,m;
    char kar[1000];
    scanf("%d",&n);
    for(i=1;i<=(2*n);++i)
    
        scanf("%d",&m);
        scanf("%s",kar[1000]);
        if(m==1)
        
            f1(kar);
        

    

【问题讨论】:

现在是learn how to debug your programs的最佳时机。 虽然有一些提示:scanf 函数期望什么样的参数?如何访问数组中的单个元素?未初始化的局部变量,包括像kar 这样的数组是未初始化的,具有indeterminate(并且看似随机)的值。听听你的编译器,它应该为那个程序对你大喊大叫。 还有how to write readable code。 @Someprogrammerdude 这仅适用于合理的编译器,不一定适用于所有可能的编译器。 : ] 【参考方案1】:

这个

      scanf("%s",kar[1000]);

应该触发编译器警告,因为您传递 char 应该是 char*。你传递了kar 的第 1001 个元素(它超出了kar 的范围,顺便说一句)。在 C 数组中,第一个元素的索引从 0 开始。

要扫描到kar,只需传递kar 的第一个 元素的地址。

      scanf("%s", &kar[0]);

由于数组在传递给函数时会衰减到其第一个元素的地址,因此以下语句是等效的

      scanf("%s", kar);

请注意,上述两个语句很好地允许用户输入更多字符,然后kar 可以容纳,并且这使得scanf() 溢出kar,即越界写入,调用未定义的行为,这可能使您的程序崩溃或其他任何事情...

为避免这种情况,请告诉scanf() 要扫描的最大值:

      scanf("%999s", kar);

一个字符串在 C 中可以容纳的 chars 的最大值总是比定义为 C 字符串需要多一个 char 以使其结尾由 '\0'terminator 标记。

【讨论】:

以上是关于用指针影响字符串[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

C:反向字符串函数不影响指针

我想使用指针和双指针读取 n 个字符串,我得到一个奇怪的错误,访问违规写入位置 [关闭]

如何将指针从 strtok 转换为字符串? [关闭]

关于函数返回的字符指针的最佳实践[关闭]

运行后删除指向已排序字符串数组的指针会给我一个错误[关闭]

Go-常识补充-切片-map(类似字典)-字符串-指针-结构体