没有理由将StudentName 声明为字符StudentName[1][40]。只需将数组声明为:
char StudentName[40] = {0};
注意上面,数组也被初始化为包含所有zero's。这是一个养成的好习惯。初始化所有变量是一种好习惯的原因有很多。在这里,通过初始化为0,您可以使用 nul-terminating 字符填充 字符数组(您可能会将其用作 字符串),因此,如果您未能显式终止您的字符串,它会通过您的初始化为您完成。
接下来在进行字符输入时(一次一个字符),您通常希望使用getchar 或fgetc 以避免使用scanf 系列函数时固有的一些缺陷。 `getchar 的简单实现如下所示:
#include <stdio.h>
int main (void) {
char StudentName[40] = {0}; /* char array */
int letter = 0; /* int value */
size_t idx = 0; /* array index */
printf ("\nEnter StudentName (until ':'): "); /* always prompt */
/* read input until ':' (or end-of-line or end-of-input) */
while ((letter = getchar()) != ':' && letter != '\n' && letter != EOF) {
StudentName[idx++] = letter;
if (idx + 1 == 40) break; /* prevent writing beyond array */
}
StudentName[idx] = 0; /* nul-terminate string */
printf ("\nYou entered: %s\n\n", StudentName);
return 0;
}
注意:您要检查您的 sentinel 字符 ':',但您还必须检查 行尾 (换行符'\n')和输入结束(EOF,通常是-1)。如果您将文件或其他内存块传递给您的代码,并且您未能检查换行符和EOF,如果您的输入中没有':',您的代码将继续读取您的输入之外的内容。 (直到发生不好的事情阻止它......)同样,您需要验证存储在数组中的字符数不超过40 - 1(为nul-terminating 字符留出空间)。只需进行简单的索引检查或检查存储的字符数即可。
虽然您可以随意使用数组索引来用字符填充数组,但这是(许多)情况之一,您通常希望将指针分配到数组的开头,然后简单地使用指针来填充您的大批。它本质上是一个“最适合情况”的问题,这意味着两者都不比另一个更对/错,但是熟悉将指针向下移动是 C 中字符串/字符处理的基础。下面是一个使用指针。
#include <stdio.h>
int main (void) {
char StudentName[40] = {0}; /* char array */
char *p = StudentName; /* pointer */
int c = 0; /* int value */
printf ("\nEnter StudentName (until ':'): "); /* always prompt */
/* read input until ':' (or end-of-line or end-of-input) */
while ((c = getchar()) != ':' && c != '\n' && c != EOF) {
*p++ = c;
if (p - StudentName + 1 == 40) break; /* prevent writing beyond array */
}
*p = 0; /* nul-terminate string */
printf ("\nYou entered: %s\n\n", StudentName);
return 0;
}
编译
gcc -Wall -Wextra -O3 -o bin/studentname studentname.c
(将-O3 优化替换为-g 以生成带有gcc 的调试符号)
使用示例
$ ./bin/studentname
Enter StudentName (until ':'): John Q. Smith:Age 21:Weight 180
You entered: John Q. Smith
或将输入重定向到您的程序:
$ printf "John Q. Smith:Age 21:Weight 180\n" | ./bin/studentname2
Enter StudentName (until ':'):
You entered: John Q. Smith
注意: 这只是一个小问题,但如果您打算接受用户输入,提示用户。否则,用户只能看着闪烁的光标,想知道程序是否挂起。显然你不会在从文件中读取,但是当要求输入时,prompt。
如果您还有其他问题,请告诉我。