在char数组指针中指定一个值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在char数组指针中指定一个值相关的知识,希望对你有一定的参考价值。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX40 40

/* run this program using the console pauser or add your own getch, system("pause") or input loop */


Int40 *parseString(char *str)
{
    Int40 *p;
    char *ptr;
    int i, len, value, ptrValue;

    printf("%s\n", str);


        for(i = 0; i < 40; i++)
{
    if(str[i] == 'a')
    {
        printf("%c\n", str[i]);
            str[i] = '0';
        printf("%c\n", str[i]);
    }

    }
}

int main(int argc, char *argv[])
 {
 // char string[40] = "
 // char *str = string;
    Int40 *p;


    parseString("0123456789abcdef0123456789abcdef01234567");

    return 0;
}

在我的parseString函数中,在两个printf语句之间,我试图将'a'的特定点的值赋给0.我不知道我应该如何尝试这个,我想保持变量也一样。

答案

这里你的问题是你向parseString传递一个指向字符串文字的指针。修改字符串文字的内容是未定义的行为,并且大多数时候字符串文字驻留在只读内存中,这就是程序崩溃的原因。

您必须创建一个数组并使用您想要的字符串对其进行初始化,然后将该数组传递给该函数:

#include <string.h>

void parseString(char *str, size_t len)
{
    printf("%s\n", str);


    for(size_t i = 0; i < len; i++)
    {
        if(str[i] == 'a')
        {
            printf("%c\n", str[i]);
                str[i] = '0';
            printf("%c\n", str[i]);
        }
    }
}

int main(int argc, char *argv[])
{
    char text[] = "0123456789abcdef0123456789abcdef01234567";

    parseString(text, sizeof text / sizeof *text);

    return 0;
}

在将数组传递给函数时要记住,该函数只获得指向数组第一个元素的指针。因此,被调用的函数无法确定数组的长度。更好的做法是传递数组的长度。这就是为什么我在size_t len中添加parseString作为参数。在宣布mainarray中,我用sizeof text / size *text计算数组的长度。请注意,这只适用于纯数组,如果你在sizeof str / sizeof *str中执行parseString,你肯定会得到一个错误的结果,这就是为什么你应该总是传递数组的长度。

另一答案

您的程序具有未定义的行为。

根据标准尝试修改字符串文字导致未定义的行为,因为它们可能存储在只读存储中或与其他字符串文字组合。

您正在将字符串文字传递给parseString()函数:

parseString("0123456789abcdef0123456789abcdef01234567");

并在parseString(),试图修改它:

str[i] = '0';

相反,在main()函数中你可以这样做:

char str[] = "0123456789abcdef0123456789abcdef01234567";

这相当于:

char str[] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','0','1','2','3','4','5','6','7','\0'};

[注意结尾处的终止空字符。]

所以,你可以这样做:

#include <stdio.h>

void parseString(char *pstr)
{
    char * str = pstr;
    printf("%s\n", str);
    for(int i = 0; str[i] != '\0'; i++)
    {
        if(str[i] == 'a')
        {
            printf("%c\n", str[i]);
            str[i] = '0';
            printf("%c\n", str[i]);
        }
    }
    printf("%s\n", pstr);
}

int main(int argc, char *argv[])
 {
    char str[] = "0123456789abcdef0123456789abcdef01234567";
    parseString(str);
    printf("%s\n", str);
    return 0;
}

请注意,在我的程序中,我只展示用'a'字符替换'0'。因此,我删除了OP代码中存在的typedef struct Int40...

以上是关于在char数组指针中指定一个值的主要内容,如果未能解决你的问题,请参考以下文章

如何将一个char数组中元素插入到另一个char数组中指定元素后面,在java语言环境,但不能使用java的内置函数

c语言:如何将字符串中指定的字符替换为另一个指定字符

从数组中删除一个元素,在Javascript中指定一个值

计算字符串中指定字符最大连续出现的次数

在 glTexImage2D() 中指定 GL_RGBA32F 时输出奇怪

c语言:如何将字符串中指定的字符替换为另一个指定字符