此程序接受用户输入并保存到char数组中。然后创建一个文件并将这些文本放到新文件中。问题是,它只能复制空格之前的部分。当前输出:“如何阅读”-->“如何阅读”
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argv, char *argc[]){
int fd;
char buffer[100];
printf("Type your text : ");
scanf("%s",&buffer);
fd=open("menew.txt",O_CREAT|O_WRONLY|O_EXCL,S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH);
if(fd<0){
printf("file already exist!\n");
}else printf("file created!\n");
fd=write(fd,buffer,20);
if(fd<0){
printf("error on writing...\n");
}else printf("successfully written!\n");
close(fd);
return 0;
}发布于 2010-01-07 01:43:34
我终于找到了解决方案!使用scanf("%s",&buffer);的gets(buffer);实例
发布于 2010-01-07 00:55:10
问题不在于写入,而在于读取-- scanf %s转换跳过任何前导空格,然后读取并转换到(但不包括)下一个空格。
您可能希望使用类似fgets或scanf的%[^\n]转换。
编辑:我可能还应该提到,当您使用扫描集转换(%[^\n])时,您应该指定正在读入的缓冲区的长度。
至于scanf("%s", &buffer);中的&buffer是一个错误,从技术上讲,它确实提供了未定义的行为,但在现实中,我不知道有什么实现能真正起到作用。
在本例中,buffer被定义为数组,而不是指针。在许多情况下,数组的名称会“衰减”为指针,但当用作address-of运算符(一元&)的操作数时则不会。因此,buffer和&buffer产生完全相同的结果,即数组开头的地址。
尽管如此,还是有区别的。当您只使用buffer时,您将获得一个类型为pointer to char的值(假设该缓冲区是一个字符数组)。当你使用&buffer时,你会得到一个pointer to array of MAXLEN char类型的指针。
现在,当您将一个值传递给scanf (一个可变函数)时,当您传递的值的类型与您指定的转换所期望的类型不匹配时,您会得到未定义的行为。实际上,对于我听说过的每一个C编译器,它都会工作得很好,因为无论哪种方式都会传递相同的地址。在理论上(但仅在理论上,AFAIK)编译器可以使用某种类型的“胖指针”,包括类型信息和地址,因此scanf将能够检测到类型不匹配。实际上,我不知道有哪个编译器会做类似的事情,所以在这种情况下,您不会看到只使用buffer和使用&buffer有什么不同。
然而,在其他情况下,这种差异是可以检测到的。指针上的加法和减法是基于类型的,因此(例如) array+1和&array + 1将产生不同的结果:
#include <stdio.h>
int main() {
char array[10];
printf("%p %p %p\n", array, array+1, &array+1);
return 0;
}这将打印三个数字。第一个数字是一些任意的数字,通常是十六进制的。第二个数组将比第一个数组大1,第二个数组将比第一个数组大10 (因为我将其定义为一个包含10个字符的数组……)
发布于 2010-01-07 00:57:53
至少一个错误:
scanf("%s",&buffer);应该是:
scanf("%s", buffer);你正在获取一个指针的地址。可能不是你想要的。
编辑:
scanf也有曾傑瑞·科芬所描述的局限性。
https://stackoverflow.com/questions/2014577
复制相似问题