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

时间:2018-03-06 00:07:25

标签: c arrays pointers struct

#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语句之间,我试图在&#39; a&#39;的特定点分配值。到了0.我不确定我应该怎么做这个,我想保持变量也一样。

2 个答案:

答案 0 :(得分:0)

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

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

#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。在声明main的{​​{1}}中,我计算了 array数组的长度。请注意,这只适用 使用纯数组,如果你在sizeof text / size *text中执行了sizeof str / sizeof *str,那么 肯定会得到一个错误的结果,这就是为什么你应该总是通过 阵列的长度。

答案 1 :(得分:0)

您的程序存在未定义的行为。

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

您正在将字符串文字传递给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...