我正在写一个代码,我想让它扫描一个名字,直到它到达“:”,但不知怎的,它继续扫描“:”。 那是我的代码:
char letter, StudentName[1][40];
int j=0;
scanf("%c", &letter);
while (letter != ":")
{
StudentName[1][j] = letter;
j++;
scanf("%c", &letter);
}
另外,虽然代码运行,但我收到一条警告信息:“警告C4047:'!=':'int'的间接级别与'char [2]”不同
答案 0 :(得分:3)
在while循环条件下进行字符串比较而不是char比较。
你基本上要求的是((char *)letter ==(char *)" String")。
两件事:
一个 - 这不是你如何进行字符串比较。 (见:strcmp)。
两个 - 你甚至不想进行字符串比较,你想进行字符比较,所以将双引号改为单引号。
另外,你的字符串甚至不在堆栈上,它只在read read部分,因为它是在编译时分配的 - 所以没有堆栈/堆分配的指针永远不会是它&& #39; s相等:)。
此外,当您使用 N 索引分配数组时,您可以访问的最大索引不会有访问冲突/分段错误的错误 N-1 ,所以在你的例子,我改变了这一行:
StudentName[1][j] = letter;
到
StudentName[0][j] = letter;
而且,为了健壮性,请考虑在用户可以插入的输入量上加上一个上限(即 - 对while循环施加限制不超过sizeof(StudentName)字符的另一个条件。)
答案 1 :(得分:1)
没有理由将StudentName
声明为char StudentName[1][40]
。只需将数组声明为:
char StudentName[40] = {0};
注意上面,数组也被初始化为包含所有zero
个。这是一个很好的习惯。为什么初始化所有变量是一种好的做法有很多原因。在这里,通过初始化为0
,您可以使用 nul-terminated 填充字符数组(您可能将其用作字符串)如果你没有明确地终止你的字符串,那么就可以通过你的初始化来完成它。
接下来当进行字符输入(一次一个字符)时,您通常会想要使用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
字符留出空间)。只需进行简单的索引检查或检查存储的字符数即可。
虽然您可以自由地使用数组索引来为数组填充字符,但这是一种(很多)情况,您通常需要指定一个指向数组开头的指针,然后只需使用指针填充您的数组阵列。它本质上是一个最适合环境的东西&#39;问题,意味着两者都没有比另一个更正确/错误,但熟悉在字符串中向下走指针是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
注意:,这只是一个问题,但如果您打算接受用户输入,提示该用户。否则,用户将看到一个闪烁的光标,想知道程序是否挂起。显然你在阅读文件时不会,但在要求输入时,提示。
如果您有任何其他问题,请与我们联系。
答案 2 :(得分:-1)
你可以这样做,你不需要一个可变的字母。如果你想使用变量字母你只需要分配字符&#39;:&#39;写信并将其与StudentName值进行比较
int i,j;
for(i=0;i<2;i++){
for(j=0;j<40;j++){
if(StudentName[i][j]==':')}break;
scanf("%c", &StudentName[i][j]);}