【问题标题】:c char pointer assignmentc char 指针赋值
【发布时间】:2013-05-15 02:41:21
【问题描述】:

我在为 char 指针赋值时遇到问题。

#include<stdio.h>

int main(int argc, char* argv[]){
    char line[200], *p, q;
    int i=0;
    FILE* f=fopen(argv[1], "r");
    for( ; ;){
            p=fgets(line, 200, f);
            if (p==NULL) break;
            printf("%s", p);
            i=0;
            while(p[i]!='\n'){
                    if (p[i]=='a') p[i]='A';
                    i++;
            }
            printf("%s", p);

    }
}

我知道,那行

p[i]='A';

不起作用,但这就是我基本上需要做的,将char* 替换为charp 必须是 char*,因为 fgets() 会返回它。我的问题是我是否可以以某种方式将char* 转换为char [],或者是否有办法为char* 赋值?

【问题讨论】:

  • p[i]='A' 应该可以工作(假设您希望它将 char 数组的元素 i 设置为 'A')。您遇到了什么问题?
  • 为什么它不能工作?对我来说它看起来非常好。
  • “我知道,p[i]='A'; 行不起作用” - 它在什么意义上不起作用?你怎么知道它不起作用?
  • p[i] = 'A'; 很好。究竟什么不起作用?如果未读取换行符,请注意潜在的缓冲区溢出。
  • 您是否希望它更改文件的内容?这是我能想到的唯一思路,这是行不通的。

标签: c pointers char variable-assignment


【解决方案1】:

您的代码按原样完美运行。从一个基本案例开始,给定一个输入文件,例如:

abcd

您的程序输出到控制台的 1 个换行符(“d”后的“回车”键):

abcd
abcd

这正是您的编码方式。它不会Abcd 写回文件,因为您打开文件只是为了读取而不是写入。希望那不是你想要的。

注意:如果您的文件中没有换行符,或者从一开始就超过 200 个字符,您可能会看到缓冲区溢出,这可能会导致它看起来不起作用。再说一遍,从我展示的一个非常基本的文件开始,并确保您的代码与您在此处发布的完全相同


&gt; I know, that the linep[i]='A';没用,

  • 不正确,您可以使用指向数组p 的指针或数组本身line 来访问和更改元素。 fgets() 将前 200 个字符(或直到第一个换行符)存储到 line 中,并返回您分配给 p 的指向它的指针,可以访问或更改数组中的字符。

&gt; I ... need to ..., replace a char* with a char

  • 这不是你在这里做的。您正在使用 char *p 访问数组并将 char 'a' 更改为 'A'

&gt; p needs to be a char* because fgets() returns that.

  • 实际上fgets() 给了你两件事,它填充并“返回”你的数组(line),它还返回一个char * 给你填充的数组。所以不,你根本不需要使用p,在下面,同样的代码完全不需要指针:


int main(int argc, char* argv[]){
    char line[200];
    int i=0;
    FILE* f=fopen("test.txt", "r");
    for( ; ;){
            if (fgets(line, 200, f)==NULL) break;
            printf("%s", line);
            i=0;
            while(line[i]!='\n'){
                    if (line[i]=='a') line[i]='A';
                    i++;
            }
            printf("%s", line);

    }
    return 0;
}

【讨论】:

    猜你喜欢
    • 2016-06-23
    • 2011-12-05
    • 1970-01-01
    • 2011-10-27
    • 2011-05-17
    • 2019-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多