- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有这个小问题,解决不了。
问题是我试图通过要求用户插入函数 LOAD
来加载所有四个字符串。一切似乎都很好,我没有收到任何编译器错误。但是 eaf
保持空。我尝试了很多方法,甚至将 scanf
替换为 gets
、gets_s
、fgets
,但没有任何改变。
#include <conio.h>
#include <stdio.h>
#include <string.h>
void LOAD(char eaf[], char initials[], char finals[], char symbols[]);
int COMPARE(char s[], char eaf[]);
int main()
{
char eaf[10],initials[1],finals[10],symbols[5];
LOAD(eaf, initials, finals, symbols);
return 0;
}
void LOAD(char eaf[], char initials[], char finals[], char symbols[])
{
printf("Insert states of the optimized AFD\n");
scanf( " %s", eaf);
printf("Insert AFD initial state\n");
do
{
scanf( " %s", initials);
} while (COMPARE(initials, eaf));
printf("Insert final state(s)\n");
do
{
scanf( " %s",finals);
} while (COMPARE(finals, eaf));
printf("Insert the language symbols\n");
scanf( " %s",symbols);
}
int COMPARE(char s[], char eaf[])
{
int i;
char *ptr;
for(i; i < strlen(s); i++){
printf("%d\n", i);
while(ptr==NULL){
ptr = strchr(eaf, *s);
}
}
if (ptr == NULL) return 1;
else return 0;
}
我做错了什么?这只是一个更大程序的一小部分,但其余部分没有用,因为 eaf
是空的。我认为问题出在使用 scanf
上,但正如我所说,其他功能也无法正常工作。我希望任何人都可以帮助我。谢谢
编辑:我通过strlen(eaf)
检查
最佳答案
使用“scanf”进行输入是危险的,而您已经步入了危险之中。当您要求它以字符串形式读取首字母并添加终止 0 时,您允许它覆盖“eaf”的内容。
最终,字符串为空,因为您的数组维度有误。您为“initials”指定了一个大小为 1 的数组,它没有为尾随的 '\0' C 字符串终止符提供空间。
在 ideone 上查看此代码的现场演示:
#include <stdio.h>
void report(char* eaf, char* initials, char* foo)
{
printf("eaf = %p, initials = %p, foo = %p\n", eaf, initials, foo);;
printf("*eaf = %d, *initials = %d, *foo = %d\n", eaf[0], initials[0], foo[0]);
}
void load(char eaf[], char initials[], char foo[])
{
printf("load\n");
report(eaf, initials, foo);
printf("Enter EAF\n");
scanf(" %s", eaf);
report(eaf, initials, foo);
printf("Enter initial state\n");
scanf(" %s", initials);
report(eaf, initials, foo);
}
int main(int argc, const char* argv[])
{
char eaf[10], initials[1], foo[10];
report(eaf, initials, foo);
load(eaf, initials, foo);
report(eaf, initials, foo);
return 0;
}
您应该已经在调试器中完成了这个过程,并观察了“eaf”和“initials”的值,以了解在您进行过程中发生了什么。
你必须用 C 编写这个程序吗?似乎使用 perl 或 python 等脚本语言对您来说可能更容易。
这是开始解决问题的有效 C 方法,请注意,我实际上并没有解决问题,但它会让它更容易看到。
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>
void report(char* eaf, char* initials, char* foo)
{
printf("eaf = %p, initials = %p, foo = %p\n", eaf, initials, foo);;
printf("*eaf = %d, *initials = %d, *foo = %d\n", eaf[0], initials[0], foo[0]);
}
void load(const char* label, const char* into, size_t intoSize)
{
assert(intoSize > 1); // can't store a string in 1 character.
printf("%s\n", label);
char input[1024] = "";
fgets(input, sizeof(input), stdin);
size_t len = strlen(input);
// strip trailing \n off.
if (len > 0 && input[len - 1] == '\n') {
input[--len] = 0;
}
// abort on empty input
if (len <= 0) {
fprintf(stderr, "Invalid input - terminated.\n");
exit(1);
}
if (len >= intoSize) {
fprintf(stderr, "Invalid input - length was %u, limit is %u\n", len, intoSize - 1);
exit(2);
}
strncpy(into, input, intoSize);
}
int main(int argc, const char* argv[])
{
char eaf[10], initials[1], foo[10];
report(eaf, initials, foo);
load("Insert states of the optimized AFD", eaf, sizeof(eaf));
report(eaf, initials, foo);
load("Insert initial AFD state", initials, sizeof(initials));
report(eaf, initials, foo);
printf("eaf = %s\ninitials = %s\n", eaf, initials);
return 0;
}
观看现场演示 ideone here .
关于c - 为什么这个字符串是空的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17602461/
如何使用 SPListCollection.Add(String, String, String, String, Int32, String, SPListTemplate.QuickLaunchO
我刚刚开始使用 C++ 并且对 C# 有一些经验,所以我有一些一般的编程经验。然而,似乎我马上就被击落了。我试过在谷歌上寻找,以免浪费任何人的时间,但没有结果。 int main(int argc,
这个问题已经有答案了: In Java 8 how do I transform a Map to another Map using a lambda? (8 个回答) Convert a Map>
我正在使用 node + typescript 和集成的 swagger 进行 API 调用。我 Swagger 提出以下要求 http://localhost:3033/employees/sear
我是 C++ 容器模板的新手。我收集了一些记录。每条记录都有一个唯一的名称,以及一个字段/值对列表。将按名称访问记录。字段/值对的顺序很重要。因此我设计如下: typedef string
我需要这两种方法,但j2me没有,我找到了一个replaceall();但这是 replaceall(string,string,string); 第二个方法是SringBuffer但在j2me中它没
If string is an alias of String in the .net framework为什么会发生这种情况,我应该如何解释它: type JustAString = string
我有两个列表(或字符串):一个大,另一个小。 我想检查较大的(A)是否包含小的(B)。 我的期望如下: 案例 1. B 是 A 的子集 A = [1,2,3] B = [1,2] contains(A
我有一个似乎无法解决的小问题。 这里...我有一个像这样创建的输入... var input = $(''); 如果我这样做......一切都很好 $(this).append(input); 如果我
我有以下代码片段 string[] lines = objects.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.No
这可能真的很简单,但我已经坚持了一段时间了。 我正在尝试输出一个字符串,然后输出一个带有两位小数的 double ,后跟另一个字符串,这是我的代码。 System.out.printf("成本:%.2
以下是 Cloud Firestore 列表查询中的示例之一 citiesRef.where("state", ">=", "CA").where("state", "= 字符串,我们在Stack O
我正在尝试检查一个字符串是否包含在另一个字符串中。后面的代码非常简单。我怎样才能在 jquery 中做到这一点? function deleteRow(locName, locID) { if
这个问题在这里已经有了答案: How to implement big int in C++ (14 个答案) 关闭 9 年前。 我有 2 个字符串,都只包含数字。这些数字大于 uint64_t 的
我有一个带有自定义转换器的 Dozer 映射: com.xyz.Customer com.xyz.CustomerDAO customerName
这个问题在这里已经有了答案: How do I compare strings in Java? (23 个回答) 关闭 6 年前。 我想了解字符串池的工作原理以及一个字符串等于另一个字符串的规则是
我已阅读 this问题和其他一些问题。但它们与我的问题有些无关 对于 UILabel 如果你不指定 ? 或 ! 你会得到这样的错误: @IBOutlet property has non-option
这两种方法中哪一种在理论上更快,为什么? (指向字符串的指针必须是常量。) destination[count] 和 *destination++ 之间的确切区别是什么? destination[co
This question already has answers here: Closed 11 years ago. Possible Duplicates: Is String.Format a
我有一个Stream一个文件的,现在我想将相同的单词组合成 Map这很重要,这个词在 Stream 中出现的频率. 我知道我必须使用 collect(Collectors.groupingBy(..)
我是一名优秀的程序员,十分优秀!