我对指针并不熟悉,我偶然发现我的代码出现了分段错误,如果我不使用指针,这段代码运行得很好。
#include <stdio.h>
#include <string.h>
int main()
{
char *string[100],i,j;
char *(*odd)[100];
i = j = 0;
fgets(*string, 100, stdin);
while (*string[i] != '\0') {
if (i % 2 == 0) {
*odd[j++] = string[i];
}
i++;
}
*odd[j] = '\0';
printf("Characters at odd position: %s\n",*odd[j]);
return 0;
}
我猜测我以错误的方式打印odd
数组,但我也无法使用*odd
打印它。
答案 0 :(得分:2)
char *string[100],i,j;
fgets(*string, 100, stdin);
您正在尝试写入string[0]
的地址,但未初始化。我想你的意思就像是
char string[100];
fgets(string, 100, stdin);
P.S。 char *string[]
是一个指向char的指针数组,而char string[]
是一个字符数组,对于这种情况,表达式string
衰减指向第一个元素,即指向char的指针。
答案 1 :(得分:2)
使用指针:
var Dispatcher = new Rx.Subject();
var source1 = Dispatcher.filter(x => x === 'foo');
var source2 = Dispatcher.filter(x => x === 'bar');
var source3 = Dispatcher.filter(x => x === 'baz');
var combined = source1.publish(function(s1) {
return source2.publish(function(s2) {
return source3.publish(function(s3) {
var cL = s1.combineLatest(s2, s3).take(1).do(() => console.log('cL'));
var wLF = s1.skip(1).withLatestFrom(s2, s3).do(() => console.log('wLF'));
return Rx.Observable.merge(cL, wLF);
});
});
});
var sub1 = combined.subscribe(x => console.log('x', x));
// These can arrive in any order
// and we can get multiple values from any one.
Dispatcher.onNext('foo');
Dispatcher.onNext('bar');
Dispatcher.onNext('foo');
Dispatcher.onNext('baz');
// combineLatest triggers once we have all values.
// cL
// x ["foo", "bar", "baz"]
// withLatestFrom takes over from there.
Dispatcher.onNext('foo');
Dispatcher.onNext('bar');
Dispatcher.onNext('foo');
// wLF
// x ["foo", "bar", "baz"]
// wLF
// x ["foo", "bar", "baz"]
没有指针:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define SIZEOF_BUFFER 100
int main(){
char *string; // string is a pointer
char i,j;
char *odd; // odd is a pointer
// allocate memory to be able to store data
string = malloc(sizeof(char) * SIZEOF_BUFFER);
if (string == NULL) {
exit(-1);
}
odd = malloc(sizeof(char) * SIZEOF_BUFFER);
if (od == NULL) {
free(string);
exit(-1);
}
i = j = 0;
fgets(string, SIZEOF_BUFFER, stdin);
while (string[i] != '\0') {
if (i % 2 == 0) {
odd[j++] = string[i];
}
i++;
}
odd[j] = '\0';
printf("Characters at odd position: %s\n",odd);
// Don't forget to free allocated memory
free(odd);
free(string);
return 0;
}
另外,不需要#include <stdio.h>
#include <string.h>
int main(){
char string[100],i,j;
char odd[100];
i = j = 0;
fgets(string, 100, stdin);
while (string[i] != '\0') {
if (i % 2 == 0) {
odd[j++] = string[i];
}
i++;
}
odd[j] = '\0';
printf("Characters at odd position: %s\n",odd);
return 0;
}
=&gt; *string[strlen(*string) - 1] = '\0';
在字符串
答案 2 :(得分:1)
这是[] vs *的优先级问题。见http://en.cppreference.com/w/c/language/operator_precedence。要解决它,请执行以下解释:
(*odd)[j] = '\0';
这也适用于声明;声明字符串作为指向100个字符数组的指针,将其更改为:
char (*string)[100];
您还必须分配内存。以下是包含所有这些更改的代码的更改版本:
#include <stdio.h>
#include <string.h>
int main(){
char actualstring[100];
char (*string)[100] = &actualstring, i = 0, j = 0;
char actualodd[100];
char (*odd)[100] = &actualodd;
fgets(*string, 100, stdin);
(*string)[strlen(*string) - 1] = '\0';
while ((*string)[i] != '\0') {
if (i % 2 == 0) {
(*odd)[j++] = (*string)[i];
}
i++;
}
(*odd)[j] = '\0';
printf("Characters at odd position: %s\n",*odd);
return 0;
}
您可能会发现将声明翻译为英语非常有用,反之亦然http://cdecl.org/
答案 3 :(得分:0)
string
是一个指针数组。你没有初始化任何指针。但是你会通过这些指针写下来,好像他们指向某个地方一样。
您的代码是一个更复杂的版本:
char *ptr;
fgets(ptr, 100, stdin);
其中(希望)应该明白问题是什么。 odd
也有类似的问题。