在C

时间:2016-11-12 16:03:35

标签: c arrays pointers

我似乎无法解决问题。我错过了什么?

考虑以下

int main(int argc, char *argv[]) {
    while ( *argv ) {
        printf("argv[] is: %s\n", *argv);
        ++argv;
    }

    return 0;
}

这会打印出argv的每个值。因此,./example arg1 arg2之类的命令行将输出以下内容:

`argv[] is: ./example`
`argv[] is: arg1`
`argv[] is: arg2`

现在考虑以下(我遇到麻烦):

int main(void) {
    char *days[] = {
        "Sunday",
        "Monday",
        "Tuesday"
    };
    while ( *days ) {
        printf("day is %s\n", *days);
        *days++;
    }

    return 0;
}

如果我尝试编译,我会收到错误cannot increment value of type 'char *[3]'

如果我将*days++更改为(*days)++,则会进行编译。如果我运行它,它将永远运行并最终以bus error失败。

但是,它不会遍历days[]的每个值。我甚至尝试在日期数组中以'\0'"\0"的形式放入Null指针,以便无效。

我错过了什么?

4 个答案:

答案 0 :(得分:7)

您的代码中有几处错误:

  1. 变量docker run ... -P和常量argv之间存在差异。变量可以改变,常数阵列标签 - 不能。

  2. 在数组中,数组末尾缺少终止符NULL。

  3. 在这种情况下,
  4. days毫无意义。这是一个虚拟的,返回值为*days++;,之后增加days。只需使用days

  5. 就足够了

    因此,您的代码必须如下:

    days++

答案 1 :(得分:6)

argv []结构包含一个空指针作为最后一个条目,这就是你的代码工作的原因。您可以向数据结构添加空指针。您还需要意识到argv是一个参数(就像一个局部变量),它指向包含命令行参数的内部数据结构。您需要创建一个可以迭代数组的类似局部变量。

这是一个解决方案:

#include <stdio.h>
int main(void) {
    char *days[] = {"Sunday", "Monday", "Tuesday", 0 };
    char **v = days;

  while (v) {
    printf("day is %s\n", *v);
    v++;
  }

  return 0;
}

答案 2 :(得分:1)

不应尝试增加字符指针,而应该遍历字符数组中的每个元素。

例如:

char *days[] = {
    "Sunday",
    "Monday",
    "Tuesday"
};
int i;    
for (i = 0; i < 3; i++) 
    printf("day is %s\n", days[i]);

答案 3 :(得分:1)

  1. @IBAction func SendSMS(sender: AnyObject) { //Checking whether device support message sending if (MFMessageComposeViewController.canSendText() == false) { return } let messageVC = MFMessageComposeViewController() messageVC.recipients = ["5146276051"] messageVC.body = messageLabel.text messageVC.messageComposeDelegate = self self.presentViewController(messageVC, animated: true, completion: nil) } 是一个2D字符数组。虽然数组的名称指向第一个地址,但它不是指针。您不能对数组名称执行指针算法。
  2. days绝不会变错。你应该改变逻辑。
  3. 在下面的代码中,我保留了大部分代码。

    while ( *days )