我似乎无法解决问题。我错过了什么?
考虑以下
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指针,以便无效。
我错过了什么?
答案 0 :(得分:7)
您的代码中有几处错误:
变量docker run ... -P
和常量argv
之间存在差异。变量可以改变,常数阵列标签 - 不能。
在数组中,数组末尾缺少终止符NULL。
days
毫无意义。这是一个虚拟的,返回值为*days++;
,之后增加days
。只需使用days
。
因此,您的代码必须如下:
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)
@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字符数组。虽然数组的名称指向第一个地址,但它不是指针。您不能对数组名称执行指针算法。days
绝不会变错。你应该改变逻辑。在下面的代码中,我保留了大部分代码。
while ( *days )